Để cập nhật trường của phần tử trong mảng, sử dụng $set kết hợp positional operator ($) để xác định vị trí phần tử khớp điều kiện.
Tạo collection với mảng CollegeDetails
> db.demo494.insertOne({
"CollegeDetails": [
{ "CollegeName": "MIT", "Fees": 80000 },
{ "CollegeName": "SU", "Fees": 90000 }
]
});
Hiển thị dữ liệu gốc
> db.demo494.find().pretty();
Kết quả:
{
"CollegeDetails": [
{ "CollegeName": "MIT", "Fees": 80000 },
{ "CollegeName": "SU", "Fees": 90000 }
]
}
Cập nhật Fees của MIT từ 80000 thành 100000
> db.demo494.update(
{ "CollegeDetails.CollegeName": "MIT" },
{ $set: { "CollegeDetails.$.Fees": 100000 } }
)
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
Kết quả sau cập nhật
> db.demo494.find().pretty();
Kết quả:
{
"CollegeDetails": [
{ "CollegeName": "MIT", "Fees": 100000 }, // Đã cập nhật
{ "CollegeName": "SU", "Fees": 90000 }
]
}
Giải thích:
- Filter
{"CollegeDetails.CollegeName": "MIT"}: Tìm document có phần tử trong mảng CollegeDetails với CollegeName = "MIT" CollegeDetails.$.Fees: Positional operator$đại diện cho **index của phần tử đầu tiên khớp** trong mảng (index 0 - MIT)$set: Chỉ cập nhật trường Fees của phần tử đó
Lưu ý quan trọng:
- Positional
$chỉ cập nhật **một** phần tử khớp đầu tiên - Nếu có 2 MIT trong mảng, chỉ cái đầu được cập nhật
- MongoDB 3.6+: Dùng
$[với] arrayFiltersđể cập nhật **tất cả** phần tử khớp:
db.demo494.update(
{},
{ $set: { "CollegeDetails.$[elem].Fees": 100000 } },
{ arrayFilters: [{ "elem.CollegeName": "MIT" }], multi: true }
)
Cách này cập nhật Fees cho **tất cả** MIT trong mảng của **tất cả** document.