我的数据库中有大量的文档,我想知道如何浏览所有文档并更新它们,每个文档具有不同的值。
答案取决于您使用的驱动程序。我所知道的所有MongoDB驱动程序都以cursor.forEach()一种或另一种方式实现。
cursor.forEach()
这里有些例子:
collection.find(query).forEach(function(doc) { // handle }, function(err) { // done or error });
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回调内部更新文档的唯一问题是您不知道何时更新所有文档。
要解决此问题,您应该使用一些异步控制流解决方案。以下是一些选项:
这是一个使用async,使用其queue功能的示例:
async
queue
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(); } }