sql >> Databáze >  >> NoSQL >> MongoDB

Vložit pole do existujícího dokumentu

Zde je ve vašem kódu několik chyb. V první řadě je třeba poznamenat, že nyní běžíte v "asynchronním" prostředí a musíte změnit způsob, jakým některé věci děláte.

Váš předchozí kód PHP je „blokující“, což znamená, že před přechodem na další řádek kódu musí být dokončen každý řádek kódu. To zahrnuje čekání, až databázový server provede aktualizaci a vrátí odpověď.

Nemůžete použít základní řídicí smyčky s funkcemi uvnitř, které se provádějí asynchronně. Místo toho potřebujete něco, co může zavolat další iteraci smyčky (nebo alespoň signalizovat, že jedna iterace je dokončena), jakmile asynchronní funkce "update" skutečně vrátí výsledek.

Druhým bodem je, že „nic se neaktualizovalo“, protože jste funkci neřekli, co má aktualizovat nebo čím aktualizovat odpovídající dokument.

Následující text je analogický s vaším původním výpisem PHP, ale upravený pro "asynchronní" metody také používá async.eachSeries pro ovládání smyčky z async knihovna:

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() příkaz místo toho vrátí dokument, který byl změněn a s úpravami, pouze pokud o ně požádáte pomocí { "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
    }
);

Pokud chcete přidat více prvků pole najednou nebo pokud máte dokonce jeden prvek přímo v poli, použijte $each modifikátor na $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. Proč je SQLite v tomto jednoduchém benchmarku rychlejší než Redis?

  2. Reagovat:použijte axios k odeslání stavu do MongoDB

  3. MongoDB $atan

  4. Název MongoDB:locale::facet::_S_create_c_locale není platný