NodeJS - 使用mongoose

时间:2017-12-01 17:58:15

标签: javascript node.js mongoose bigdata

我的mongodb中有一个大约有10个Mio文档的集合。我想遍历所有这些以改变某些领域。由于数据太多,并且使用如下的限制

,因此一次性全部崩溃会导致程序崩溃
MyModel.find({/* condition... */}).limit(500).exec()

是有问题的,因为每次都返回相同的文档,因为我的修改不会改变条件。

任何人都可以提示我如何逐步遍历/修改整个集合吗?

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用 (aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*b)* 方法?见http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html。它的工作方式是指定查询和更新语句,并搜索与查询匹配的所有文档,然后将更新应用于每个文档。 E.g。

Model.update

如果你真的必须使用find-then-update,你可能想要使用一个游标,这将确保一组文档被流式传输而不是一次完全在内存中实现:

const query = {};
const update = {$set: {name: "Bob"}};
const options = {};
Model.update(query, update, options, callback);

答案 1 :(得分:1)

Kevin概述了两个有效选项。

另一种选择是基本上分页。如果按_id排序并继续查询更大的_id,则可以保持完全相同的逻辑。类似的东西:

var lastId = new ObjectId();
MyModel.find({/* condition... */, _id: {$gt: lastId}}).sort({_id: 
1}).limit(500).exec(function(err, records){
    // Your logic
    lastId = records[records.length - 1]._id;
})

您只需将函数包装在某种异步while循环中,并确保在没有收到500条记录时退出。