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

voglio aggiornare il nome di "friends.u.username": "Michael" nome s' è 'ciao', come ho bisogno di farlo.MongoDB - aggiornare un oggetto in Array nidificato

risposta

17

Applicare l'operatore $set insieme allo $ positional operator nell'aggiornamento per modificare il campo name.

Il $ positional operator sarà identificare l'elemento corretto nella matrice di aggiornare senza specificare esplicitamente la posizione del elemento dell'array, così la vostra istruzione di aggiornamento finale dovrebbe essere simile:

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

Per qualche ragione non funziona per me ... Niente, ma se io uso '0' invece di' '$, l'elemento (sbagliato) su array è cambiato – Dherik

+0

@Dherik Avete una domanda già con i dettagli per il tuo problema? Se no, puoi crearne uno con un documento campione e il risultato desiderato? – chridam

+0

Proverò ancora un po '. Forse c'è qualche problema con Robo3T e compatibilità con le versioni precedenti: https://stackoverflow.com/questions/4669178/how-to-update-multiple-array-elements-in-mongodb/46054172#46054172. Se non funziona nulla, aprirò una domanda. Grazie! :) – Dherik

1

È possibile utilizzare $ operatore set .

> db.test.update({"friends.u._id":"eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}}) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })