2012-12-21 13 views
36

Ho il seguente documento memorizzato in MongoDB:Come inserire un elemento nell'elenco interno di 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 'lista' utilizzando $addToSet ma non sono riuscito a trovare un modo per aggiungere a un elenco specifico di 'oggetti' un oggetto.

ad es. ottengo il seguente:

{id:5, name:'item5'} 

e voglio aggiungere che alla voce del elemento della lista con id: 2.

risposta

32

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/

Si può anche sostituire $push con altri operatori come (forse) $addToSet per ottenere i risultati esatti che stai cercando.

11

È possibile utilizzare questo: -

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

La parte query troverà il documento dalla matrice list con id = 2. Quindi utilizziamo l'elemento posizionale $ per aggiungere un nuovo elemento a tale indice di array.

Vedi positional $ operator


È inoltre possibile sostituire list: {$elemMatch: {id: 2}} con appena 'list.id': 2.

Tuttavia, l'utilizzo di $elemMatch sarà migliore se si desidera eseguire l'aggiornamento in base a più elementi dell'array. Per esempio, quando i coincidenti è id e un po 'un altro campo nella matrice dicono length: -

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

nota, gli schemi con array incorporati nidificati sono quasi sempre andando a causare problemi in seguito in quanto non tutte le operazioni su elementi di livello inferiore sono possibile con il linguaggio di query corrente. Lo eviterei. –

Problemi correlati