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

Comment supprimer un élément d'un tableau doublement imbriqué dans un document MongoDB.

Pour supprimer l'élément en question, vous allez en fait utiliser une mise à jour. Plus précisément vous allez faire une mise à jour avec le $pull commande qui supprimera l'élément du tableau.

db.temp.update(
  { _id : "777" },
  {$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)

Il y a un peu de "magie" qui se passe ici. Utilisation de .0 indique que nous savons que nous modifions le 0ème élément de someArray . Utilisation de {"name":"delete me"} indique que nous connaissons les données exactes que nous prévoyons de supprimer.

Ce processus fonctionne parfaitement si vous chargez les données dans un client, puis effectuez la mise à jour. Ce processus fonctionne moins bien si vous voulez faire des requêtes "génériques" qui effectuent ces opérations.

Je pense qu'il est plus facile de simplement reconnaître que la mise à jour de tableaux de sous-documents nécessite généralement que vous ayez l'original en mémoire à un moment donné.

En réponse au premier commentaire ci-dessous, vous pouvez probablement améliorer votre situation en modifiant un peu la structure des données

"someObjects" : {
  "name1":  {
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
}

Maintenant vous pouvez faire {$pull : { "someObjects.name1.someNestedArray" : ...

Voici le problème avec votre structure. MongoDB n'a pas un très bon support pour manipuler les "sous-tableaux". Votre structure a un tableau d'objets et ces objets contiennent des tableaux d'autres objets.

Si vous avez la structure suivante, vous allez avoir du mal à utiliser des choses comme $pull :

array [
  { subarray : array [] },
  { subarray : array [] },
]

Si votre structure ressemble à ça et vous voulez mettre à jour le subarray vous avez deux options :

  1. Modifiez votre structure afin de pouvoir tirer parti de $pull .
  2. N'utilisez pas $pull . Chargez l'objet entier dans un client et utilisez findAndModify .