sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur kan jag använda en cursor.forEach() i MongoDB med Node.js?

Svaret beror på vilken drivrutin du använder. Alla MongoDB-drivrutiner jag känner har cursor.forEach() implementeras på ett eller annat sätt.

Här är några exempel:

nod-mongodb-native

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

mongojs

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

munk

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

mangus

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

Uppdaterar dokument inuti .forEach återuppringning

Det enda problemet med att uppdatera dokument inuti .forEach återuppringning är att du inte har någon aning om när alla dokument är uppdaterade.

För att lösa detta problem bör du använda någon asynkron kontrollflödeslösning. Här är några alternativ:

  • asynkron
  • löften (when.js, bluebird)

Här är ett exempel på hur du använder async , med hjälp av dess 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();
  }
}


  1. Mongoose &unikt fält

  2. redis-py :Vad är skillnaden mellan StrictRedis() och Redis()?

  3. MongoDB Aggregation Framework Stadier och pipelining

  4. mongo-kommandot känns inte igen när man försöker ansluta till en mongodb-server