2015-12-23 64 views
6
{ 
"_id" : "xPBc4By8FemDwTPqH", 
"u" : { 
    "_id" : "6PoZawHZcQz4Gwzcv", 
    "username" : "michael" 
}, 
"friends" : [ 
    { 
     "u" : { 
      "_id" : "eGqDjAjjtYADbuSnn", 
      "username" : "michael", 
      "name" : "michael" 
     } 
    }, 
    { 
     "u" : { 
      "_id" : "k4gKCGwYryXDMMHvs", 
      "username" : "joyce", 
      "name" : "joyce" 
     } 
    } 
] 
} 

Tôi muốn cập nhật tên "friends.u.username": "michael" tên là "hello", cách tôi cần thực hiện.MongoDB - Cập nhật một đối tượng trong mảng lồng nhau

Trả lời

17

Áp dụng toán tử $set cùng với $ positional operator trong bản cập nhật của bạn để thay đổi trường name.

Các $ positional operator sẽ xác định các yếu tố đúng trong mảng để cập nhật mà không cần chỉ định rõ vị trí của phần tử trong mảng, do đó báo cáo cập nhật cuối cùng của bạn sẽ giống như thế:

db.collection.update(
    { "friends.u.username": "michael" }, 
    { "$set": { "friends.$.u.name": "hello" } } 
) 
+0

Đối với một số lý do không được làm việc cho tôi ... Không có gì xảy ra, nhưng Nếu tôi sử dụng '0' thay vì' $ ', các (sai) yếu tố trên mảng được thay đổi – Dherik

+0

@Dherik Bạn có một câu hỏi đã có các chi tiết cho vấn đề của bạn? Nếu không, bạn có thể tạo một tài liệu với tài liệu mẫu và kết quả mong muốn của mình không? – chridam

+0

Tôi sẽ thử nhiều hơn một chút. Có thể là một số vấn đề về trình điều khiển với Robo3T và khả năng tương thích ngược: https://stackoverflow.com/questions/4669178/how-to-update-multiple-array-elements-in-mongodb/46054172#46054172. Nếu không có gì hiệu quả, tôi sẽ mở một câu hỏi. Cảm ơn bạn! :) – Dherik

1

Bạn có thể sử dụng $ điều hành bộ .

> db.test.update({"friends.u._id":"eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}}) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 
Các vấn đề liên quan