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