Khi cần thêm trường mới vào một đối tượng cụ thể bên trong mảng, MongoDB sử dụng toán tử định vị $ (positional operator) kết hợp với update() và $set. Toán tử $ tham chiếu đến phần tử đầu tiên trong mảng khớp với điều kiện truy vấn.
Tạo dữ liệu mẫu
> db.addAFieldDemo.insertOne(
{
"ClientName" : "Larry",
"ClientCountryName" : "US",
"ClientOtherDetails" : [
{ "ClientProjectName" : "Online Banking System" }
]
}
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd44bdc2cba06f46efe9ee8") }
Xem dữ liệu ban đầu
> db.addAFieldDemo.find().pretty();
Thêm trường vào tài liệu nhúng trong mảng
Sử dụng
$elemMatchđể tìm phần tử mảng, sau đó$để cập nhật chính phần tử đó:> db.addAFieldDemo.update( {ClientOtherDetails: {$elemMatch: {"ClientProjectName" : "Online Banking System"}}}, {$set : {'ClientOtherDetails.$.isMarried': true}}, true ); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })Kết quả sau cập nhật
> db.addAFieldDemo.find().pretty();Giải thích các thành phần
$elemMatch: Khớp tài liệu có ít nhất một phần tử mảng thỏa mãn tất cả điều kiện con$(positional operator): Tham chiếu đến phần tử mảng đầu tiên khớp với điều kiện truy vấn'ClientOtherDetails.$.isMarried': Thêm trườngisMarriedvào chính phần tử đó- Tham số
truecuối:upsert = true(tạo mới nếu không tìm thấy)
Lưu ý quan trọng
- Toán tử
$chỉ cập nhật một phần tử đầu tiên khớp - Nếu cần cập nhật nhiều phần tử, sử dụng
arrayFilters(MongoDB 3.6+) hoặc Aggregation Pipeline - Cú pháp hiện đại:
updateOne()hoặcupdateMany()thay choupdate()
Ví dụ với arrayFilters (MongoDB 3.6+)
db.addAFieldDemo.updateMany(
{},
{$set: {"ClientOtherDetails.$[elem].isMarried": true}},
{arrayFilters: [{"elem.ClientProjectName": "Online Banking System"}]}
);