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 :
- Modifiez votre structure afin de pouvoir tirer parti de
$pull
. - N'utilisez pas
$pull
. Chargez l'objet entier dans un client et utilisezfindAndModify
.