MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann ich ein cursor.forEach() in MongoDB mit Node.js verwenden?

Die Antwort hängt vom verwendeten Treiber ab. Alle mir bekannten MongoDB-Treiber haben cursor.forEach() auf die eine oder andere Weise implementiert.

Hier sind einige Beispiele:

node-mongodb-native

collection.find(query).forEach(function(doc) {
  // handle
}, function(err) {
  // done or error
});

mongojs

db.collection.find(query).forEach(function(err, doc) {
  // handle
});

Mönch

collection.find(query, { stream: true })
  .each(function(doc){
    // handle doc
  })
  .error(function(err){
    // handle error
  })
  .success(function(){
    // final callback
  });

Mungo

collection.find(query).stream()
  .on('data', function(doc){
    // handle doc
  })
  .on('error', function(err){
    // handle error
  })
  .on('end', function(){
    // final callback
  });

Aktualisierung von Dokumenten innerhalb von .forEach Rückruf

Das einzige Problem beim Aktualisieren von Dokumenten innerhalb von .forEach Rückruf ist, dass Sie keine Ahnung haben, wann alle Dokumente aktualisiert sind.

Um dieses Problem zu lösen, sollten Sie eine asynchrone Ablaufsteuerungslösung verwenden. Hier sind einige Optionen:

  • asynchron
  • Versprechungen (when.js, bluebird)

Hier ist ein Beispiel für die Verwendung von async , unter Verwendung seiner queue Funktion:

var q = async.queue(function (doc, callback) {
  // code for your update
  collection.update({
    _id: doc._id
  }, {
    $set: {hi: 'there'}
  }, {
    w: 1
  }, callback);
}, Infinity);

var cursor = collection.find(query);
cursor.each(function(err, doc) {
  if (err) throw err;
  if (doc) q.push(doc); // dispatching doc to async.queue
});

q.drain = function() {
  if (cursor.isClosed()) {
    console.log('all items have been processed');
    db.close();
  }
}