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

Я хочу, чтобы обновить название «friends.u.username»: имя «Майкл» «s это„привет“, как мне нужно это сделать.MongoDB - Обновление объекта в гнездовой массив

ответ

17

Примените оператор $set вместе с $ positional operator в вашем обновлении, чтобы изменить поле name.

$ positional operator определит правильный элемент в массиве для обновления без явного указания позиции элемента в массиве, таким образом, ваше окончательное утверждение обновления должно выглядеть следующим образом:

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

По какой-то причине не работает для меня ... Ничего не случится, но если я использую '0' вместо '$', элемент (неправильно) на массиве изменяется – Dherik

+0

@Dherik У вас есть вопрос уже с деталями для вашей проблемы? Если нет, вы можете создать его с образцом документа и желаемым результатом? – chridam

+0

Я попробую еще немного. Возможно, это проблема с драйвером Robo3T и обратной совместимостью: https://stackoverflow.com/questions/4669178/how-to-update-multiple-array-elements-in-mongodb/46054172#46054172. Если ничего не будет сделано, я открою вопрос. Спасибо! :) – Dherik

1

Вы можете использовать $ оператор множества ,

> db.test.update({"friends.u._id":"eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}}) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 
Смежные вопросы