sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man tar bort ett element från en dubbelkapslad array i ett MongoDB-dokument.

För att ta bort objektet i fråga kommer du faktiskt att använda en uppdatering. Mer specifikt kommer du att göra en uppdatering med $pull kommando som tar bort objektet från arrayen.

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

Det händer lite "magi" här. Använder .0 indikerar att vi vet att vi ändrar den 0:e posten i someArray . Använder {"name":"delete me"} indikerar att vi känner till de exakta uppgifterna som vi planerar att ta bort.

Denna process fungerar alldeles utmärkt om du laddar in data i en klient och sedan utför uppdateringen. Denna process fungerar mindre bra om du vill göra "generiska" frågor som utför dessa operationer.

Jag tror att det är lättast att helt enkelt inse att uppdatering av uppsättningar av underdokument i allmänhet kräver att du har originalet i minnet någon gång.

Som svar på den första kommentaren nedan kan du förmodligen hjälpa din situation genom att ändra datastrukturen lite

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

Nu kan du göra {$pull : { "someObjects.name1.someNestedArray" : ...

Här är problemet med din struktur. MongoDB har inte särskilt bra stöd för att manipulera "sub-arrays". Din struktur har en array av objekt och dessa objekt innehåller arrayer av fler objekt.

Om du har följande struktur kommer du att ha svårt att använda saker som $pull :

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

Om din struktur ser ut så och du vill uppdatera subarray du har två alternativ:

  1. Ändra din struktur så att du kan utnyttja $pull .
  2. Använd inte $pull . Ladda in hela objektet i en klient och använd findAndModify .


  1. Hur kan jag använda "Not Like"-operatorn i MongoDB

  2. Samma uppgift utförd flera gånger

  3. Är det säkert att ta bort journalfilen för mongodb?

  4. Pålitliga bibliotek där ute för Spring boot redis-integreringstest