猫鼬全集扫描

时间:2013-02-14 04:12:55

标签: node.js mongodb mapreduce mongoose

我想扫描整个mongo集合并计算custom聚合。我正在使用带有猫鼬的Node。为了扫描整个表格,我使用的是MyModel.find({}, callback);

当我运行代码时,我发现mongoose执行查询并在数组中收集所需的记录,然后简单地将整个数组传递给回调。现在进行完整的收集扫描需要很长时间。

不是我可能得到一个游标对象,我可以从中迭代连续映射所需的记录到一些回调,而不是等待一大堆在数组中收集。 (这是我观察到的,如果我错了,请纠正。)

此外,有人可以建议是否以正确的方式对自定义聚合进行完整的集合扫描,或者是否应该查看map-reduce或其他类似内容。

1 个答案:

答案 0 :(得分:13)

您的第一个选择应该是使用aggregate方法而不是find来执行您要查找的任何聚合。如果这不能满足您的需求,请查看mapReduce,就像您提到的那样。

但是,如果您发现需要迭代大型集合,则应该使用Mongoose对streaming查询结果的支持,而不是将其放在一个大数组中。

var stream = MyModel.find().stream();

stream.on('data', function (doc) {
  // do something with the mongoose document
}).on('error', function (err) {
  // handle the error
}).on('close', function () {
  // the stream is closed
});