MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Entfernen Sie Array-Einträge, die ein leeres Array enthalten

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

aktualisieren möchten