MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wstaw tablicę do istniejącego dokumentu

W twoim kodzie jest kilka błędów. Przede wszystkim należy zauważyć, że pracujesz teraz w środowisku „asynchronicznym” i musisz zmienić sposób myślenia o tym, jak robisz niektóre rzeczy.

Twój poprzedni kod PHP jest „blokujący”, co oznacza, że ​​każdy wiersz kodu musi zostać ukończony przed przejściem do następnego wiersza kodu. Obejmuje to oczekiwanie, aż serwer bazy danych wykona aktualizację i zwróci odpowiedź.

Nie można używać podstawowych pętli sterowania z funkcjami wewnątrz nich działającymi asynchronicznie. Zamiast tego potrzebujesz czegoś, co może wywołać następną iterację pętli (lub przynajmniej zasygnalizować, że pojedyncza iteracja jest zakończona ), gdy funkcja asynchroniczna „update” faktycznie zwróci wynik.

Drugą kwestią jest to, że „nic nie zostało zaktualizowane”, ponieważ nie powiedziałeś funkcji, co zaktualizować lub czym zaktualizować dopasowany dokument.

Poniższe jest analogiczne do oryginalnego listingu PHP, ale dostosowane do metod "async" używaj również async.eachSeries do sterowania pętlą z async biblioteka:

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() polecenie zamiast tego zwraca dokument, który został zmodyfikowany i z modyfikacjami tylko wtedy, gdy poprosisz o nie za 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
    }
);

Jeśli chcesz dodać wiele elementów tablicy naraz lub jeśli masz nawet jeden element bezpośrednio w tablicy, użyj $each modyfikator $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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak renderować wiele szablonów za pomocą jednego kontrolera tras za pomocą routera iron?

  2. mongodb:przechowywanie hierarchicznej struktury drzewa?

  3. MongoDb:różnica między $push/$addtoset

  4. Projekcja sterownika MongoDB C# $elemMatch $

  5. Korzystanie z funkcji Mongoose / MongoDB $addToSet na tablicy obiektów