Come inserire un elemento nella lista interna di MongoDB?

Ho il seguente documento memorizzato in MongoDB:

{ name: 'myDoc', list: [ { id:1 items:[ {id:1, name:'item1'}, {id:2, name:'item2'} ] }, { id:2 items:[ {id:1, name:'item1'}, {id:3, name:'item3'} ] } ] } 

Ho trovato un modo per aggiungere un elemento a ‘list’ usando $addToSet ma non sono riuscito a trovare un modo per aggiungere a un elenco specifico di ‘elementi’ un elemento.

per esempio ottengo il seguente:

 {id:5, name:'item5'} 

e voglio aggiungerlo all’elemento dell’elemento nella lista con id: 2.

Un modo per farlo sarebbe con $push :

 db.col.update( { name: 'doc', 'list.id': 2 }, {$push: {'list.$.items': {id: 5, name: 'item5'}}} ) 

http://docs.mongodb.org/manual/reference/operator/push/

Puoi anche sostituire $push con altri operatori come (possibilmente) $addToSet per ottenere i risultati esatti che stai cercando.

Puoi usare questo: –

 > var toInsert = {id: 5, name: 'item6'} > db.abc.update( { name: 'myDoc', list: { $elemMatch: { id: 2 } } }, { $addToSet: { 'list.$.items': toInsert } } ) 

La parte della query troverà il documento dall’array della list con id = 2 . Quindi usiamo $ posizionale per aggiungere un nuovo elemento a quell’indice dell’array.

Vedi positional $ operator


Puoi anche sostituire la list: {$elemMatch: {id: 2}} con solo 'list.id': 2 .

Ma usare $elemMatch sarà migliore, quando si desidera aggiornare in base a più elementi dell’array. Ad esempio, quando il tuo criterio di corrispondenza è id e qualche altro campo nell’array dice length : –

 list: {$elemMatch: {id: 2, length: 5}}