sql >> Database >  >> NoSQL >> MongoDB

Matrix invoegen in bestaand document

Er zijn een paar dingen mis in uw code hier. Allereerst moet u opmerken dat u nu in een "asynchrone" omgeving werkt en dat u de manier waarop u sommige dingen doet, moet veranderen.

Uw vorige PHP-code is "blokkerend", wat betekent dat elke regel code moet worden voltooid voordat u doorgaat naar de volgende regel code. Dit omvat het wachten op een databaseserver om een ​​update uit te voeren en het antwoord terug te sturen.

U kunt geen basisregelkringen gebruiken met daarin functies die asynchroon werken. In plaats daarvan heb je iets nodig dat de volgende iteratie van de lus kan aanroepen (of op zijn minst een signaal kan geven dat een enkele iteratie is voltooid ) zodra de asynchrone functie "update" daadwerkelijk een resultaat heeft geretourneerd.

Het tweede punt hier is dat "niets is bijgewerkt" omdat u de functie niet hebt verteld wat u moet bijwerken of waarmee u het overeenkomende document moet bijwerken.

Het volgende is analoog aan uw originele PHP-lijst, maar aangepast voor "async"-methoden gebruikt u ook de async.eachSeries voor de lusbesturing van de async bibliotheek:

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

De .findOneAndUpdate() commando retourneert in plaats daarvan het document dat is gewijzigd en met de wijzigingen alleen als u erom vraagt ​​met { "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
    }
);

Als je meerdere array-elementen tegelijk wilt toevoegen, of als je zelfs maar één enkel element rechtstreeks in een array hebt, gebruik dan de $each modifier to $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. Hoe crypto pbkdf2 op te slaan in mongoDB?

  2. MEAN-Stack slaat een array op in MongoDB met mongoose

  3. MongoDB C-stuurprogramma bouwen in Windows

  4. RSpec laadtijd ongelooflijk lang op OS X