sql >> Database >  >> NoSQL >> MongoDB

Een element verwijderen uit een dubbel geneste array in een MongoDB-document.

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:

  1. Wijzig uw structuur zodat u gebruik kunt maken van $pull .
  2. Gebruik geen $pull . Laad het hele object in een client en gebruik findAndModify .


  1. redis + gevent - Slechte prestaties - wat doe ik verkeerd?

  2. Hoe MongoDB-queryresultaten streamen met nodejs?

  3. Redis - het wat, waarom en hoe Redis als primaire database te gebruiken

  4. MongoDB-aggregaat, hoe u elk element van de array in groepspijplijn aan ToSet kunt toevoegen