sql >> Databasteknik >  >> NoSQL >> MongoDB

Looping Array och kontrollera MongoDB-samling i loop (Async)

Den allmänna nyckeln till asynkron bearbetning är att du vill ha en indikation på när den aktuella iterationen är klar innan du går vidare till nästa iteration. Eftersom de faktiska operationerna som .find() här använder sig själva av en "återuppringning" som "kallas" när operationen är avslutad med ett svar, sedan är det du vanligtvis vill göra att anropa något som anger ditt slut på iterationen i samma kodavsnitt.

På ett grundläggande sätt kan du få ett liknande resultat som du kan i traditionella loopar med "async.eachSeries " metod, som bara låter "en iteration åt gången" ske:

function check (collection) {
    var records = [ { body: "Test 1"}, { body: "Test 2" } ];
    async.eachSeries(records,function(item,callback) {
        collection.find( item, function (err, rows) {
            console.log(rows);
            callback(err)
        });
    },function(err) {
        if (err) throw err;
        console.log("done");
    });
}

Så vart och ett av array-argumenten skickas in till "iterator"-funktionen här som en "item"-parameter, och ett andra argument är en "callback"-funktion som ska användas senare. Varje gång iteratorn anropas skickas det argumentet till .find() metod som i sin tur har en egen "återuppringning", där svaret "fel" eller "dokument" ges.

Inuti den återuppringningen anropas sedan "återuppringningen" som tillhandahålls av "iterator"-funktionen för att signalera slutförandet av den aktuella iterationen. Detta gör att "varje"-funktionen här kan fortsätta och faktiskt anropa nästa "iteration" och bearbeta nästa matriselement.

Notera din bakgrund, var medveten om det korrekta sättet att notera en "array" i JavaScript med [] fästen som visas. Detta är i allmänhet en viktig skillnad när man arbetar med arrayer.

Det finns andra varianter av "async.each" och "async.eachLimit" som båda tillåter en viss grad av parallell bearbetning, men "Series"-metoden gör saker "i ordning" på ett sätt som du är van vid med traditionella loopar.

Så där loopoperationer är "icke-blockerande", måste du ange när den loopen är klar innan du vill gå vidare.




  1. dial tcp [::1]:6397:connectex:Ingen anslutning kunde göras eftersom målmaskinen aktivt vägrade det

  2. anslut ECONNREFUSED 127.0.0.1:27017'

  3. Redis och Memcache eller bara Redis?

  4. MongoDB Aggregation:Dubbelsökning och sammanslagningssvar till respektive objekt