Để cập nhật trường bên trong object lồng nhau, sử dụng update() (hoặc updateOne()/updateMany()) kết hợp dot notation và toán tử $set.
Tạo collection
> db.demo77.insertOne({"Details" : { "Score" : 78 } });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bd6f371bf0181ecc4228a") }
Cập nhật trường lồng nhau
> db.demo77.update({'Details.Score':78}, {$set:{'Details.Score':89}}, {multi:true});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kết quả
> db.demo77.find();
{ "_id" : ObjectId("5e2bd6f371bf0181ecc4228a"), "Details" : { "Score" : 89 } }
Giải thích:
'Details.Score': Dot notation truy cập trường lồng nhau$set: Chỉ cập nhật trường chỉ định, giữ nguyên các trường khác{multi:true}: Cập nhật tất cả document khớp (mặc định false - chỉ cập nhật 1)
Phiên bản hiện đại (MongoDB 3.2+):
// Cập nhật 1 document
db.demo77.updateOne({'Details.Score': 78}, {$set: {'Details.Score': 89}});
// Cập nhật nhiều document
db.demo77.updateMany({'Details.Score': 78}, {$set: {'Details.Score': 89}});
Nên dùng updateOne/updateMany thay vì update cũ vì API rõ ràng hơn.