J'ai le document suivant stocké dans 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'}
]
}
]
}
J'ai trouvé un moyen d'ajouter un élément à 'list' en utilisant $addToSet
mais je n'ai pas trouvé de moyen d'ajouter à une liste spécifique d '"éléments" un élément.
par exemple. J'obtiens ce qui suit:
{id:5, name:'item5'}
et je veux l'ajouter à l'élément de l'élément dans la liste avec id: 2.
Une façon de le faire serait de $Push
:
db.col.update(
{ name: 'doc', 'list.id': 2 },
{$Push: {'list.$.items': {id: 5, name: 'item5'}}}
)
http://docs.mongodb.org/manual/reference/operator/Push/
Vous pouvez également remplacer $Push
avec d'autres opérateurs comme (éventuellement) $addToSet
pour obtenir les résultats exacts que vous recherchez.
Vous pouvez utiliser ceci: -
> var toInsert = {id: 5, name: 'item6'}
> db.abc.update(
{ name: 'myDoc', list: { $elemMatch: { id: 2 } } },
{ $addToSet: { 'list.$.items': toInsert } }
)
La partie query
trouvera le document du tableau list
avec id = 2
. Ensuite, nous utilisons $
élément positionnel pour ajouter un nouvel élément à cet index de tableau.
Vous pouvez également remplacer list: {$elemMatch: {id: 2}}
avec juste 'list.id': 2
.
Mais en utilisant $elemMatch
sera meilleur lorsque vous voudrez mettre à jour en fonction de plusieurs éléments de votre tableau. Par exemple, lorsque votre critère de correspondance est id
et qu'un autre champ du tableau indique length
: -
list: {$elemMatch: {id: 2, length: 5}}