2012-05-03 29 views
51

Tôi đã một tài liệu có cấu trúc như thế này:Cập nhật lĩnh vực trong mảng yếu tố chính xác trong MongoDB

{ 
    _id:"43434", 
    heroes : [ 
     { nickname : "test", items : ["", "", ""] }, 
     { nickname : "test2", items : ["", "", ""] }, 
    ] 
} 

Tôi có thể $set phần tử thứ hai của items mảng của các đối tượng nhúng trong mảng heros với nickname"test"?

Kết quả:

{ 
    _id:"43434", 
    heroes : [ 
     { nickname : "test", items : ["", "new_value", ""] }, // modified here 
     { nickname : "test2", items : ["", "", ""] }, 
    ] 
} 

Trả lời

102

Bạn cần phải tận dụng 2 khái niệm: mongodb's positional operator và chỉ đơn giản bằng cách sử dụng chỉ số số cho các mục bạn muốn cập nhật.

Nhà điều hành theo vị trí cho phép bạn sử dụng một điều kiện như thế này:

{"heros.nickname": "test"} 

và sau đó tham khảo mục mảng tìm thấy như vậy:

{"heros.$ // <- the dollar represents the first matching array key index 

Như bạn muốn cập nhật các mục nhập mảng thứ 2 "các mục" 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", heros : [{ nickname : "test", items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]}); 
> db.denis.update(
    {"heros.nickname": "test"}, 
    {$set: { 
     "heros.$.items.1": "new_value" 
    }} 
) 
> db.denis.find() 
{ 
    "_id" : "43434", 
    "heros" : [ 
     {"nickname" : "test", "items" : ["", "new_value", "" ]}, 
     {"nickname" : "test2", "items" : ["", "", "" ]} 
    ] 
} 
+0

Mô tả đơn giản và rõ ràng. Chúc mừng –

+0

Cảm ơn bạn, Bạn đã đạt được cuộc sống của mình !!! – juanmiguelRua

+0

làm cách nào tôi có thể truy cập vào giá trị của phần tử được so khớp? như {"heros. $. items.2": "heros. $. nickname"}? – kommradHomer

Các vấn đề liên quan