MongoDB cho phép cập nhật trực tiếp các trường lồng nhau (nested fields) bằng cách sử dụng toán tử $set kết hợp với dot notation. Đây là kỹ thuật thiết yếu khi làm việc với cấu trúc tài liệu phức tạp.
Cú pháp cơ bản
db.yourCollectionName.update(
{"_id" : yourObjectId},
{$set : {"yourOuterFieldName.yourInnerFieldName" : yourValue}}
);
Ví dụ thực tế
Tạo collection updateDocumentDemo với tài liệu chứa đối tượng lồng nhau:
> db.updateDocumentDemo.insertOne(
{
"StudentDetails" : {
"StudentFirstName" : "Adam",
"StudentLastName" : "Samith"
},
"StudentOtherDetails" : {
"StudentFavouriteSubject" : "MySQL",
"StudentScore" : 45
}
}
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd50bb32cba06f46efe9efe") }
Xem dữ liệu ban đầu
> db.updateDocumentDemo.find().pretty();
{
"_id" : ObjectId("5cd50bb32cba06f46efe9efe"),
"StudentDetails" : {
"StudentFirstName" : "Adam",
"StudentLastName" : "Samith"
},
"StudentOtherDetails" : {
"StudentFavouriteSubject" : "MySQL",
"StudentScore" : 45
}
}
Cập nhật trường lồng nhau
Thay đổi StudentFavouriteSubject từ "MySQL" thành "MongoDB":
> db.updateDocumentDemo.update(
{"_id" : ObjectId("5cd50bb32cba06f46efe9efe")},
{$set : {"StudentOtherDetails.StudentFavouriteSubject" :"MongoDB"}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kiểm tra kết quả
> db.updateDocumentDemo.find().pretty();
{
"_id" : ObjectId("5cd50bb32cba06f46efe9efe"),
"StudentDetails" : {
"StudentFirstName" : "Adam",
"StudentLastName" : "Samith"
},
"StudentOtherDetails" : {
"StudentFavouriteSubject" : "MongoDB",
"StudentScore" : 45
}
}
Lưu ý quan trọng
- Sử dụng dot notation (
OuterField.InnerField) để truy cập trường lồng nhau - Toán tử
$setchỉ cập nhật trường được chỉ định, giữ nguyên các trường khác - Trong MongoDB 3.2+, khuyến nghị sử dụng
updateOne()hoặcupdateMany()thay vìupdate()