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

Array in vorhandenes Dokument einfügen

Hier sind einige Dinge in deinem Code falsch. Zuallererst ist anzumerken, dass Sie jetzt in einer "asynchronen" Umgebung arbeiten und Ihre Denkweise ändern müssen, wie Sie einige Dinge tun.

Ihr vorheriger PHP-Code ist „blockierend“, was bedeutet, dass jede Codezeile abgeschlossen werden muss, bevor mit der nächsten Codezeile fortgefahren werden kann. Dazu gehört das Warten darauf, dass ein Datenbankserver eine Aktualisierung durchführt und die Antwort zurückgibt.

Sie können keine einfachen Regelkreise mit darin enthaltenen Funktionen verwenden, die asynchron ausgeführt werden. Stattdessen benötigen Sie etwas, das die nächste Iteration der Schleife aufrufen kann (oder zumindest signalisiert, dass eine einzelne Iteration abgeschlossen ist), sobald die asynchrone Funktion "update" tatsächlich ein Ergebnis zurückgegeben hat.

Der zweite Punkt hier ist, dass "nichts aktualisiert" wurde, weil Sie der Funktion nicht mitgeteilt haben, was aktualisiert werden soll oder womit das übereinstimmende Dokument aktualisiert werden soll.

Das Folgende ist analog zu Ihrem ursprünglichen PHP-Listing, aber angepasst für "async"-Methoden verwenden Sie auch den async.eachSeries für die Schleifensteuerung vom async Bibliothek:

async.eachSeries(
    tables,
    function(table,callback) {
        var tablename  = table.tablename;
        delete table.tablename;   // just remove the key rather than re-construct
        OutAccept.update(
            { "tablename": tablename },
            { "$push": { "inventar": table } },
            function(err,numAffected) {
                console.log( numAfftected ); // tells you how many are updated or nothing
                callback(err)
            }
        );
    },
    function(err) {
       // comes here on completion of all array items
    }
);

Die .findOneAndUpdate() Der Befehl gibt stattdessen das geänderte Dokument mit den Änderungen nur dann zurück, wenn Sie mit { "new": true } danach fragen

async.eachSeries(
    tables,
    function(table,callback) {
        var tablename  = table.tablename;
        delete table.tablename;
        OutAccept.findOneAndUpdate(
            { "tablename": tablename },
            { "$push": { "inventar": table } },
            { "new": true },
            function(err,doc) {
                console.log( doc ); // shows the modified document
                callback(err)
            }
        );
    },
    function(err) {
       // comes here on completion of all array items
    }
);

Wenn Sie mehrere Array-Elemente gleichzeitig hinzufügen möchten oder sogar ein einzelnes Element direkt in einem Array haben, verwenden Sie den $each Modifikator für $push :

var inventor =  [
    {
        "ean": "2",
        "name": "name2",
        "runtime": "0",
        "art": "null",
        "marker": "null",
        "stammkost": "null",
        "accepted": "0"
    },
    {
        "ean": "1",
        "name": "name1",
        "runtime": "0",
        "art": "null",
        "marker": "null",
        "stammkost": "null",
        "accepted": "0"
    }
];


OutAccept.update(
    { "tablename": tablename },
    { "$push": { "inventar": { "$each": inventar } } },
    function(err,numAffected) {
       // work in here
    }
);