Ich weiß nicht, was Sie versucht haben, da es einfach nicht in Ihrer Frage enthalten ist, aber der beste Weg, um nach einem leeren Array zu suchen, besteht darin, im Grunde nachzusehen, wo der 0
ist Index stimmt nicht mit $exists
überein
:
Inventory.update(
{ "products.rates.0": { "$exists": false } },
{
"$pull": {
"products": { "rates.0": { "$exists": false } }
}
},
{ "multi": true },
function(err,numAffected) {
}
)
Der "Abfrage"-Teil von .update()
-Anweisung stellt sicher, dass wir nur versuchen, Dokumente zu berühren, die ein leeres Array in "products.rates"
haben . Das ist nicht erforderlich, aber es vermeidet das Testen der folgenden "update"-Anweisungsbedingung für Dokumente, bei denen diese Bedingung nicht true
ist für jedes Array-Element und macht die Sache dadurch etwas schneller.
Der eigentliche „Update“-Teil gilt $pull
auf "products"
-Array, um alle Elemente zu entfernen, bei denen das "innere" "rates"
ist ist ein leeres Array. Also der "Pfad" innerhalb des $pull
tatsächlich in die "products"
schaut Inhalt sowieso, also ist es relativ zu diesem und nicht zum gesamten Dokument.
Natürlich $pull
entfernt alle übereinstimmenden Elemente in einem einzigen Vorgang. Der "multi"
wird nur benötigt, wenn Sie wirklich mehr als ein Dokument mit der Anweisung