Để cập nhật document lồng sâu trong mảng, sử dụng update() kết hợp positional operator ($) để xác định vị trí phần tử trong mảng.
Tạo collection với mảng lồng 2 cấp
> db.demo643.insertOne({
details: [
{
"CountryName": "US",
StudentDetails: [{Name:"Chris"}, {SubjectName:"MySQL"}]
},
{
"CountryName": "UK",
StudentDetails: [{Name:"Bob"}, {SubjectName:"Java"}]
}
]
});
Hiển thị cấu trúc gốc
> db.demo634.find();
Kết quả:
{
"details": [
{ "CountryName": "US", "StudentDetails": [{ "Name": "Chris" }, { "SubjectName": "MySQL" }] },
{ "CountryName": "UK", "StudentDetails": [{ "Name": "Bob" }, { "SubjectName": "Java" }] }
]
}
Thêm trường Marks vào StudentDetails của UK
> db.demo643.update(
{ "details.CountryName": "UK" },
{ "$push": { "details.$.StudentDetails": { Marks: 78 } } }
)
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
Kết quả sau cập nhật
> db.demo643.find().pretty();
Kết quả:
{
"details": [
{ "CountryName": "US", "StudentDetails": [{ "Name": "Chris" }, { "SubjectName": "MySQL" }] },
{
"CountryName": "UK",
"StudentDetails": [
{ "Name": "Bob" },
{ "SubjectName": "Java" },
{ "Marks": 78 } // <-- Đã thêm
]
}
]
}
Giải thích:
{ "details.CountryName": "UK" }: Tìm document có phần tử trong mảngdetailsvớiCountryName = "UK"details.$: Positional operator$trỏ đến **phần tử đầu tiên** khớp trong mảngdetails(index của UK)$push: Thêm phần tử mới vào mảngStudentDetailscủa phần tử đó
Lưu ý: Positional operator $ chỉ cập nhật **một** phần tử khớp đầu tiên. Nếu cần cập nhật nhiều phần tử, dùng $[] (all positional) MongoDB 3.6+.