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

推荐答案

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

Updating documents inside of .forEach callback

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

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

下面是使用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相关问答推荐

如何修复PayPal Node.js Webhook中Webhook签名验证失败?''

MongoDB如果文档S的字段小于另一个字段,则将该字段加一

仅在一次查询中 MongoDB 上最近的一对位置

Puppeteer 在本地运行良好,但在 Heroku 中运行不佳

使用单个 MongoDB 查询更新多个元素

使用更新版本仍然找到包@angular/fire但不支持原理图

Google App Engine 突然不允许我部署我的 node.js 应用程序

yarn 安装失败,因为 node-gyp 正在寻找过时的 node 版本标头

使用 node/express/Multer,您如何首先判断参数?

部署云功能 Firebase/Stripe 时出错

Pug - 包括带有include关键字的c代码

node和mongoDB聚合数据时的输入字段函数

您如何写入 aws lambda 实例的文件系统?

Nodejs-console.error vs util.debug

与 NPM 一起安装时找不到 Express 模块

如何brew安装特定版本的Node?

为什么模块级返回语句在 Node.js 中起作用?

mongo 可以 upsert 数组数据吗?

npm install - javascript堆内存不足

在 Node.js 上使用 Connect 无法获取 /