答案取决于您使用的驱动程序。我所知道的所有MongoDB驱动程序都以
cursor.forEach()一种或另一种方式实现。
这里有些例子:
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});僧
collection.find(query, { stream: true }) .each(function(doc){ // handle doc }) .error(function(err){ // handle error }) .success(function(){ // final callback });猫鼬
collection.find(query).stream() .on('data', function(doc){ // handle doc }) .on('error', function(err){ // handle error }) .on('end', function(){ // final callback });在.forEach
回调内部更新文档
在
.forEach回调内部更新文档的唯一问题是您不知道何时更新所有文档。
要解决此问题,您应该使用一些异步控制流解决方案。以下是一些选项:
- 异步的
- 承诺(when.js,bluebird)
这是一个使用
async,使用其
queue功能的示例:
var q = async.queue(function (doc, callback) { // pre 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(); }}


