MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb :pousser l'élément vers un tableau imbriqué si la condition est remplie

Le problème ici est votre malentendu sur certaines choses.

Lorsque vous faites "outerArray.field.innerArray": { $in: [ 1, 3 ] } dans votre requête, vous n'obtenez pas seulement innerArray où a 1 ou 3. Vous obtenez des documents là où existent ces tableaux.

Vous interrogez donc l'ensemble du document.

Vous devez utiliser arrayFilter pour mettre à jour les valeurs lorsque le filtre correspond.

Donc, si je vous ai bien compris, la requête que vous voulez est :

db.collection.update(
{}, //Empty object to find all documents
{
  $push: { "outerArray.$[elem].field.innerArray": 4 }
},
{
  "arrayFilters": [ { "elem.field.innerArray": { $in: [ 1, 3 ] } } ]
})

Exemple ici

Notez comment le premier objet dans update est vide. Vous devez y mettre le champ correspondant au document (pas le tableau, le document).

Si vous souhaitez mettre à jour un seul document, vous devez remplir le premier objet (objet de requête) avec les valeurs souhaitées, par exemple :{"_id": 11} .