【发布时间】:2013-01-02 23:45:20
【问题描述】:
我有一个包含超过 1000000 个文档的 mongoDB 集合,我想用 dedicated 信息逐个更新每个文档(每个文档都有来自其他集合的信息)。
目前我正在使用从集合中获取所有数据的游标,并通过 Node.js 的异步模块更新每个记录
获取所有文档:
inst.db.collection(association.collection, function(err, collection) {
collection.find({}, {}, function(err, cursor) {
cursor.toArray(function(err, items){
......
);
});
});
更新每个文档:
items.forEach(function(item) {
// *** do some stuff with item, add field etc.
tasks.push(function(nextTask) {
inst.db.collection(association.collection, function(err, collection) {
if (err) callback(err, null);
collection.save(item, nextTask);
});
});
});
并行调用“保存”任务
async.parallel(tasks, function(err, results) {
callback(err, results);
});
您会以更有效的方式进行此类操作吗?我的意思是如何避免加载游标的初始“查找”。现在有没有办法通过一个文档来做一个操作文档,知道所有文档都应该更新?
感谢您的支持。
【问题讨论】:
-
您是否有理由在开始处理之前获取所有文档?为什么不只遍历一个游标而不是将它们全部读入一个数组并遍历一个数组?
-
是的,我同意你的观点,但在处理每个文档之前,必须先加载光标。你有不同的例子吗?
-
不是真的 - 文档将分批从服务器获取(默认一次 100 个)。您正在强制一次获取 所有 文档。