node.js - 如何使用 Node.js 在 MongoDB 中使用 cursor.forEac

我的数据库中有大量文档,我想知道如何遍历所有文档并更新它们,每个文档都有不同的值。

最佳答案

答案取决于您使用的驱动程序。我知道的所有 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
});

monk

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

mongoose

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

.forEach 回调中更新文档

.forEach 回调中更新文档的唯一问题是您不知道所有文档何时更新。

要解决这个问题,您应该使用一些异步控制流解决方案。以下是一些选项:

  • async
  • promise (when.js,bluebird)

这里是一个使用 async 的例子,使用它的 queue feature :

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();
  }
}

关于node.js - 如何使用 Node.js 在 MongoDB 中使用 cursor.forEach()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507866/

相关文章:

mongodb - 对 MongoDB $in 查询的响应顺序?

mongodb - 修改和重放 MongoDB oplog

java - MongoDB中不区分大小写的排序

node.js - MongoDB Node 检查objectid是否有效

node.js - Mongoose 填充与对象嵌套

javascript - 在 JavaScript 中将 ObjectID (Mongodb) 转换

c# - 支持和反对从 SQL Server 迁移到 MongoDB 的原因

mongodb - 如何发现 mongodb 数据库结构

python - 哪个 Python API 应该与 Mongodb 和 Django 一起使用

mongodb - mongodb insert 命令中是否有 "upsert"选项?