sql >> Databasteknik >  >> NoSQL >> MongoDB

Infoga Array i befintligt dokument

Det är några saker som är fel i din kod här. Först och främst att notera är att du kör i en "asynkron" miljö nu och du behöver ändra tanken på hur du gör vissa saker.

Din tidigare PHP-kod är "blockerande", vilket innebär att varje rad kod måste fyllas i innan du går vidare till nästa kodrad. Detta inkluderar att vänta på att en databasserver ska utföra en uppdatering och returnera svaret.

Du kan inte använda grundläggande styrslingor med funktioner inuti dem som fungerar asynkront. Istället behöver du något som kan anropa nästa iteration av loopen (eller åtminstone signalera att en enstaka iteration är klar) när den asynkrona funktionen "uppdatering" faktiskt har returnerat ett resultat.

Den andra punkten här är att "inget uppdaterat" eftersom du inte berättade för funktionen vad den ska uppdatera eller vad den ska uppdatera det matchade dokumentet med.

Följande är analogt med din ursprungliga PHP-lista, men justerat för "async"-metoder använder du även async.eachSeries för loopkontrollen från async bibliotek:

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
    }
);

.findOneAndUpdate() kommandot returnerar istället dokumentet som ändrades och med ändringarna endast om du ber om dem med { "new": true }

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
    }
);

Om du vill lägga till flera arrayelement samtidigt, eller om du till och med har ett enda element direkt i en array, använd $each modifierare till $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
    }
);



  1. mongologgrotation fungerar inte på Windows

  2. php mongodb fulltextsökning och sortering

  3. mongodb.conf bind_ip =127.0.0.1 fungerar inte men 0.0.0.0 fungerar

  4. Dela upp strängen i en array av delsträngar eller tecken i MongoDB