2012-02-08 22 views
9

C'è un modo semplice per sostituire un intero documento incorporato in un array? Di 'la sostituzione:Sostituzione del documento incorporato nell'array in MongoDB

{ 
    "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
} 

con:

{ 
    "_id" : "2", 
     "name" : "name6", 
     "xyz..." : "xyz5..." 
     "morefields..." : "fields..." 
} 

Ricerca di _id (embedded). O devo sostituire ogni campo individualmente usando $ set?

{ 
    "_id" : "2", 
    "users" : [{ 
     "_id" : "1", 
     "name" : "name1", 
     "xyz..." : "xyz1..." 
    }, { 
     "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
    }], 
    "name" : "main name" 
} 

risposta

18

Si sta utilizzando il modello "matrice di oggetti". È possibile utilizzare il positional operator, dovrebbe essere simile a questa:

coll.update({'_id':'2', 'users._id':'2'}, {$set:{'users.$':{ "_id":2,"name":"name6",... }}}, false, true) 

Nella mia esperienza, la "matrice di oggetti" modello non è ottimale se gli oggetti hanno un ID naturale. Nel vostro caso, questo potrebbe essere modellato come il seguente:

{ 
    "_id" : "2", 
    "users" : 
    { "1" : { "name" : "name1", "xyz..." : "xyz1..." }, 
     "2" : { "name" : "name2", "xyz..." : "xyz2..." } 
    } 
    "name" : "main name" 
} 

In questo caso è possibile utilizzare il dot notation di aggiornare facilmente la voce desiderata.

var newValue = { "name" : "name6", "xyz..." : "xyz5...", "morefields..." : "fields..." }; 
coll.update({_id: 2}, { $set: { "users.2" : newValue } }); 
+0

Che funziona benissimo, grazie! Interessante la seconda alternativa ma non sono sicuro che funzionerà dato che dovrò rimuovere alcune voci nel mezzo. "users.2" è la posizione nell'array presumo. –

+0

Ho pensato che gli utenti.2 si riferivano alla posizione dell'array ma in realtà utilizza l'id (e restituisce parentesi vuote per tutti gli altri elementi dell'array}, cool –

+0

MongoDB riconosce gli array in una query. Array degli utenti alla ricerca di oggetti con 'key' of' 2' * o * potrebbe guardare la chiave ': 2' di' users'. –

Problemi correlati