sql >> Database teknologi >  >> NoSQL >> MongoDB

Indsæt Array i eksisterende dokument

Der er et par ting galt i din kode her. Først og fremmest skal du bemærke, at du kører i et "asynkront" miljø nu, og du skal ændre tankegangen om, hvordan du gør nogle ting.

Din tidligere PHP-kode er "blokerende", hvilket betyder, at hver linje kode skal fuldføres, før du går videre til den næste kodelinje. Dette inkluderer at vente på, at en databaseserver udfører en opdatering og returnerer svaret.

Du kan ikke bruge grundlæggende kontrolsløjfer med funktioner inde i dem, der fungerer asynkront. I stedet har du brug for noget, der kan kalde den næste iteration af løkken (eller i det mindste signalere, at en enkelt iteration er fuldført), når den asynkrone funktion "opdatering" faktisk har returneret et resultat.

Det andet punkt her er, at "intet er opdateret", fordi du ikke fortalte funktionen, hvad den skulle opdatere, eller hvad den skulle opdatere det matchede dokument med.

Følgende er analogt med din oprindelige PHP-liste, men justeret for "async"-metoder, brug også async.eachSeries til sløjfestyringen fra 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() kommandoen returnerer i stedet det dokument, der blev ændret og med ændringerne, hvis du beder 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
    }
);

Hvis du vil tilføje flere array-elementer på én gang, eller hvis du endda har et enkelt element direkte i et array, så brug $each modifikator til $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. MongoDB aggregat/gruppe/sum-forespørgsel oversat til pymongo-forespørgsel

  2. Denne node blev ikke startet med replSet-indstillingen

  3. Hvordan kan jeg beregne positiv og negativ pris ved hjælp af mongodb eller robomongo?

  4. Hvordan fungerer sortering med et indeks i MongoDB?