Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS-使用mongoose解析大型集合_Javascript_Node.js_Mongoose_Bigdata - Fatal编程技术网

Javascript NodeJS-使用mongoose解析大型集合

Javascript NodeJS-使用mongoose解析大型集合,javascript,node.js,mongoose,bigdata,Javascript,Node.js,Mongoose,Bigdata,我在mongodb中收集了大约1000万份文档。我想遍历所有这些字段以更改某些字段。由于数据太多,一次获取所有数据会导致程序崩溃,并使用如下限制 MyModel.find({/* condition... */}).limit(500).exec() 这是有问题的,因为每次都会返回相同的文档,因为我的修改不会改变条件 有谁能给我一个提示,告诉我如何增量遍历/修改整个集合吗?您是否尝试过使用Model.update方法?看见其工作方式是指定查询和update语句,然后搜索与查询匹配的所有文档,然

我在mongodb中收集了大约1000万份文档。我想遍历所有这些字段以更改某些字段。由于数据太多,一次获取所有数据会导致程序崩溃,并使用如下限制

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的聚合。