我的数据库中有大量文档,我想知道如何遍历所有文档并更新它们,每个文档都有不同的值。
最佳答案
答案取决于您使用的驱动程序。我知道的所有 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
的例子,使用它的 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/