Om het betreffende item te verwijderen ga je eigenlijk een update gebruiken. Meer specifiek ga je een update doen met de $pull
commando dat het item uit de array zal verwijderen.
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
Er gebeurt hier een beetje "magie". Met behulp van .0
geeft aan dat we weten dat we het 0e item van someArray
. wijzigen . Gebruik {"name":"delete me"}
geeft aan dat we de exacte gegevens kennen die we van plan zijn te verwijderen.
Dit proces werkt prima als u de gegevens in een client laadt en vervolgens de update uitvoert. Dit proces werkt minder goed als u "generieke" query's wilt uitvoeren die deze bewerkingen uitvoeren.
Ik denk dat het het gemakkelijkst is om gewoon te erkennen dat het bijwerken van arrays van subdocumenten over het algemeen vereist dat je het origineel op een bepaald moment in het geheugen hebt.
Als reactie op de eerste opmerking hieronder, kunt u uw situatie waarschijnlijk helpen door de gegevensstructuur een beetje te wijzigen
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
Nu kunt u {$pull : { "someObjects.name1.someNestedArray" : ...
doen
Dit is het probleem met je structuur. MongoDB heeft geen erg goede ondersteuning voor het manipuleren van "sub-arrays". Je structuur heeft een array van objecten en die objecten bevatten arrays van meer objecten.
Als je de volgende structuur hebt, zul je het moeilijk hebben om dingen als $pull
. te gebruiken :
array [
{ subarray : array [] },
{ subarray : array [] },
]
Als uw structuur er zo uitziet en je wilt subarray
updaten je hebt twee opties:
- Wijzig uw structuur zodat u gebruik kunt maken van
$pull
. - Gebruik geen
$pull
. Laad het hele object in een client en gebruikfindAndModify
.