Javascript NodeJS-使用mongoose解析大型集合
我在mongodb中收集了大约1000万份文档。我想遍历所有这些字段以更改某些字段。由于数据太多,一次获取所有数据会导致程序崩溃,并使用如下限制Javascript NodeJS-使用mongoose解析大型集合,javascript,node.js,mongoose,bigdata,Javascript,Node.js,Mongoose,Bigdata,我在mongodb中收集了大约1000万份文档。我想遍历所有这些字段以更改某些字段。由于数据太多,一次获取所有数据会导致程序崩溃,并使用如下限制 MyModel.find({/* condition... */}).limit(500).exec() 这是有问题的,因为每次都会返回相同的文档,因为我的修改不会改变条件 有谁能给我一个提示,告诉我如何增量遍历/修改整个集合吗?您是否尝试过使用Model.update方法?看见其工作方式是指定查询和update语句,然后搜索与查询匹配的所有文档,然
MyModel.find({/* condition... */}).limit(500).exec()
这是有问题的,因为每次都会返回相同的文档,因为我的修改不会改变条件
有谁能给我一个提示,告诉我如何增量遍历/修改整个集合吗?您是否尝试过使用
Model.update
方法?看见其工作方式是指定查询和update语句,然后搜索与查询匹配的所有文档,然后将更新应用于每个文档。例如
const query = {};
const update = {$set: {name: "Bob"}};
const options = {};
Model.update(query, update, options, callback);
如果确实必须使用“查找然后更新”,则可能需要使用光标,这将确保文档集以流方式传输,而不是立即在内存中完全实现:
const cursor = Model.find(query).cursor()
cursor.on('data', function(doc) {});
cursor.on('close', callback);
您是否尝试过使用
Model.update
方法?看见其工作方式是指定查询和update语句,然后搜索与查询匹配的所有文档,然后将更新应用于每个文档。例如
const query = {};
const update = {$set: {name: "Bob"}};
const options = {};
Model.update(query, update, options, callback);
如果确实必须使用“查找然后更新”,则可能需要使用光标,这将确保文档集以流方式传输,而不是立即在内存中完全实现:
const cursor = Model.find(query).cursor()
cursor.on('data', function(doc) {});
cursor.on('close', callback);
凯文概述了两个有效的选择 另一种选择是基本上分页。如果您按
\u id
排序并不断查询更大的\u 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条记录时退出。Kevin概述了两个有效选项
另一种选择是基本上分页。如果您按\u id
排序并不断查询更大的\u 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;
})
您只需要在循环时将函数包装成某种异步,并确保在没有收到500条记录时退出。我认为您应该看看跳过mongodb的聚合。我认为您应该看看跳过mongodb的聚合。