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

Wie ziehe ich eine Instanz eines Elements in einem Array in MongoDB?

Sie haben also Recht mit $pull Der Operator tut genau das, was die Dokumentation sagt, indem seine Argumente tatsächlich eine "Abfrage" sind, die verwendet wird, um die zu entfernenden Elemente abzugleichen.

Wenn Ihr Array-Inhalt zufällig immer das Element an der "ersten" Position hat, wie Sie es zeigen, dann $pop Operator entfernt tatsächlich dieses erste Element.

Mit dem Basis-Knotentreiber:

collection.findOneAndUpdate(
    { "array.0": "bird" },       // "array.0" is matching the value of the "first" element 
    { "$pop": { "array": -1 } },
    { "returnOriginal": false },
    function(err,doc) {

    }
);

Bei Mungo ist das Argument zur Rückgabe des modifizierten Dokuments anders:

MyModel.findOneAndUpdate(
    { "array.0": "bird" },
    { "$pop": { "array": -1 } },
    { "new": true },
    function(err,doc) {

    }
);

Beide sind jedoch nicht von großem Nutzen, wenn die Array-Position des "ersten" zu entfernenden Elements nicht bekannt ist.

Für den allgemeinen Ansatz hier benötigen Sie "zwei" Updates, eines, um das erste Element abzugleichen und es durch etwas Einzigartiges zu ersetzen, das entfernt werden soll, und das zweite, um dieses geänderte Element tatsächlich zu entfernen.

Dies ist viel einfacher, wenn einfache Aktualisierungen angewendet werden und nicht nach dem zurückgegebenen Dokument gefragt wird, und kann auch in großen Mengen über Dokumente hinweg durchgeführt werden. Es hilft auch, so etwas wie async.series zu verwenden, um eine Verschachtelung Ihrer Aufrufe zu vermeiden:

async.series(
    [
        function(callback) {
            collection.update(
                { "array": "bird" },
                { "$unset": { "array.$": "" } },
                { "multi": true }
                callback
            );
        },
       function(callback) {
           collection.update(
                { "array": null },
                { "$pull": { "array": null } },
                { "multi": true }
                callback
           );
       }
    ],
    function(err) {
       // comes here when finished or on error   
    }
);

Verwenden Sie also den $unset hier mit dem positionellen $ -Operator ermöglicht es, das "erste" Element in null zu ändern . Dann die anschließende Abfrage mit $pull entfernt einfach alle null Eintrag aus dem Array.

So entfernen Sie sicher das "erste" Vorkommen eines Wertes aus einem Array. Zu bestimmen, ob dieses Array mehr als einen Wert enthält, der jedoch gleich ist, ist eine andere Frage.