Ved ikke, hvad du prøvede, da det simpelthen ikke er inkluderet i dit spørgsmål, men den bedste måde at tjekke for et tomt array på er at se, hvor 0
er. indekset matcher ikke $exists
:
Inventory.update(
{ "products.rates.0": { "$exists": false } },
{
"$pull": {
"products": { "rates.0": { "$exists": false } }
}
},
{ "multi": true },
function(err,numAffected) {
}
)
"Query"-delen af .update()
erklæring sørger for, at vi kun forsøger at røre ved dokumenter, der har et tomt array i "products.rates"
. Det er ikke påkrævet, men det undgår at teste følgende "opdaterings"-sætningsbetingelse på dokumenter, hvor denne betingelse ikke er true
for ethvert array-element, og dermed gøre tingene en smule hurtigere.
Den faktiske "opdaterings"-del gælder $pull
på "products"
array for at fjerne nogen af de elementer, hvor den "indre" "rates"
er et tomt array. Så "stien" i $pull
ser faktisk inde i "products"
indhold alligevel, så det er relativt til det og ikke til hele dokumentet.
Naturligvis $pull
vil fjerne alle elementer, der matcher i en enkelt handling. "multi"
er kun nødvendig, når du virkelig ønsker at opdatere mere end ét dokument med erklæringen