我的mongodb中有一个大约有10个Mio文档的集合。我想遍历所有这些以改变某些领域。由于数据太多,并且使用如下的限制
,因此一次性全部崩溃会导致程序崩溃MyModel.find({/* condition... */}).limit(500).exec()
是有问题的,因为每次都返回相同的文档,因为我的修改不会改变条件。
任何人都可以提示我如何逐步遍历/修改整个集合吗?
答案 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条记录时退出。