For at slette det pågældende element skal du faktisk bruge en opdatering. Mere specifikt vil du lave en opdatering med $pull
kommando, som vil fjerne elementet fra arrayet.
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
Der sker en lille smule "magi" her. Brug af .0
angiver, at vi ved, at vi ændrer det 0. element i someArray
. Brug {"name":"delete me"}
angiver, at vi kender de nøjagtige data, som vi planlægger at fjerne.
Denne proces fungerer fint, hvis du indlæser dataene i en klient og derefter udfører opdateringen. Denne proces fungerer mindre godt, hvis du vil lave "generiske" forespørgsler, der udfører disse operationer.
Jeg tror, det er nemmest blot at erkende, at opdatering af arrays af underdokumenter generelt kræver, at du har originalen i hukommelsen på et tidspunkt.
Som svar på den første kommentar nedenfor, kan du sikkert hjælpe din situation ved at ændre datastrukturen lidt
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
Nu kan du gøre {$pull : { "someObjects.name1.someNestedArray" : ...
Her er problemet med din struktur. MongoDB har ikke særlig god support til at manipulere "sub-arrays". Din struktur har en række objekter, og disse objekter indeholder arrays af flere objekter.
Hvis du har følgende struktur, vil du få svært ved at bruge ting som $pull
:
array [
{ subarray : array [] },
{ subarray : array [] },
]
Hvis din struktur ser sådan ud og du vil opdatere subarray
du har to muligheder:
- Skift din struktur, så du kan udnytte
$pull
. - Brug ikke
$pull
. Indlæs hele objektet i en klient og brugfindAndModify
.