¿Cómo insertar un elemento en la lista interna de MongoDB?


Tengo el siguiente documento almacenado en 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'}
            ]
        }
    ]
}

Encontré una manera de agregar un elemento a 'list' usando $addToSet pero no pude encontrar una manera de agregar un elemento a una lista específica de 'items'.

E. g. Obtengo lo siguiente:

{id:5, name:'item5'} 

Y quiero añadirlo al elemento de la lista con id:2.

Author: DhiaTN, 2012-12-21

2 answers

Una forma de hacerlo sería 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 /

También puede reemplazar $push con otros operadores como (posiblemente) $addToSet para obtener los resultados exactos que está buscando.

 41
Author: Sammaye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 09:30:00

Puedes usar esto: -

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

La parte query encontrará el documento de la matriz list con id = 2. Luego usamos $ elemento posicional para agregar un nuevo elemento en ese índice de matriz.

Véase positional $ operator


También puede reemplazar list: {$elemMatch: {id: 2}} con solo 'list.id': 2.

Pero usando $elemMatch será mejor, cuando se desea actualizar basado en múltiples elementos de su matriz. Por ejemplo, cuando su criterio coincidente es id y algún otro campo en la matriz dice length: -

list: {$elemMatch: {id: 2, length: 5}}
 12
Author: Rohit Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 11:13:02