¿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.
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.
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}}
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