web-dev-qa-db-fra.com

Comment insérer un élément dans la liste interne de MongoDB?

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.

45
Guy Korland

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.

47
Sammaye

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.

Voir positional $ operator


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}}
13
Rohit Jain