【问题标题】:mongoose full collection scan猫鼬全系列扫描
【发布时间】:2013-02-14 13:02:30
【问题描述】:

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

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

难道不是我得到了一个游标对象,我可以从中迭代不断地将所需记录映射到某个回调,而不是等待一大堆被收集到数组中。 (这是我观察到的,如有错误请指正)。

另外,有人可以建议对自定义聚合进行完整的集合扫描是否正确,或者我应该查看map-reduce 或类似的替代方法。

【问题讨论】:

    标签: node.js mongodb mapreduce mongoose


    【解决方案1】:

    您的第一个选择应该是使用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
    });
    

    【讨论】:

    • 我不能使用聚合框架,我不需要完全按类型功能分组。非常custom 处理记录。另外我认为 map-reduce 也不会使我受益,因为我只会运行一个 mongod 实例。流媒体似乎是有趣的事情。谢谢队友:)
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2023-03-19
    • 2017-03-31
    • 2020-01-10
    相关资源
    最近更新 更多