Bạn cần sử dụng 2 khái niệm:toán tử vị trí của mongodb và chỉ cần sử dụng chỉ mục số cho mục nhập bạn muốn cập nhật.
Toán tử vị trí cho phép bạn sử dụng một điều kiện như sau:
{"heroes.nickname": "test"}
và sau đó tham chiếu mục nhập mảng được tìm thấy như sau:
{"heroes.$ // <- the dollar represents the first matching array key index
Khi bạn muốn cập nhật mục nhập mảng thứ 2 trong "items" và các khóa mảng được lập chỉ mục 0 - đó là khóa 1.
Vì vậy:
> db.denis.insert({_id:"43434", heroes : [{ nickname : "test", items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]});
> db.denis.update(
{"heroes.nickname": "test"},
{$set: {
"heroes.$.items.1": "new_value"
}}
)
> db.denis.find()
{
"_id" : "43434",
"heroes" : [
{"nickname" : "test", "items" : ["", "new_value", "" ]},
{"nickname" : "test2", "items" : ["", "", "" ]}
]
}