Để cập nhật giá trị của khóa trong mảng đối tượng, cần: lấy tài liệu -> duyệt mảng sửa đổi -> lưu lại toàn bộ mảng.
Ví dụ: Collection updateListOfKeyValuesDemo:
> db.updateListOfKeyValuesDemo.insertOne({
"StudentDetails": [
{ "StudentName": "John", "StudentAge": 23, "StudentCountryName": "US" },
{ "StudentName": "Carol", "StudentAge": 24, "StudentCountryName": "UK" },
{ "StudentName": "Bob", "StudentAge": 22, "StudentCountryName": "AUS" }
]
});
Cập nhật tất cả StudentName thành "Ramit":
> var doc = db.updateListOfKeyValuesDemo.findOne({ "_id": ObjectId("5c9b5b759882024390176545") });
> doc.StudentDetails.forEach(function(s) { s.StudentName = "Ramit"; });
> db.updateListOfKeyValuesDemo.update(
{ "_id": doc._id },
{ $set: { "StudentDetails": doc.StudentDetails } }
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
Kết quả: Tất cả 3 phần tử trong mảng StudentDetails giờ có StudentName = "Ramit".
Lưu ý:
- Cách này tải toàn bộ tài liệu về client, sửa, ghi đè lại (replace array).
- MongoDB 3.6+: Dùng
arrayFiltersvới$[elem]để cập nhật trực tiếp trên server mà không tải toàn bộ mảng. - Ví dụ arrayFilters:
db.coll.updateMany({}, { $set: { "StudentDetails.$[elem].StudentName": "Ramit" } }, { arrayFilters: [{ "elem.StudentName": { $exists: true } }] })