Mongoose find()with cursor vs findOne()performance

时间:2017-11-29 17:49:02

标签: node.js mongodb mongoose mongodb-query

与find()

相比,我对findOne()mongoose查询的查询时间长得非常长
var batchSize = 25;
var cursor = collection1.find().lean().cursor({batchSize: batchSize});
cursor.on('data', function(col1rec){
    var parm1 = col1rec.parm1;
    var parm2 = col1rec.parm2;
    collection2.findOne({parm1:parm1}, function(err, col2rec){
        collection3.findOne({parm2:parm2}, function(err, col3rec){
            var linkRec = Object.assign({}, col1rec, col2rec, col3red);
            new Collection4(linkRec).save();
        });
    });
});

用例:链接来自不同馆藏的记录。

  1. 在collection1上获取游标以循环;
  2. 使用parm1查询collection2并找到doc。
  3. 使用parm2查询collection3并找到doc。
  4. 将链接记录保存到mongoDB collection4。
  5. collection2有parm1有索引,而Collection3有parm2有索引。

    要监控我使用mongotop的数据库平均查询次数。产生以下输出:

             ns    total    read    write    2017-11-29T17:12:50Z
    Collection3     56ms    56ms      0ms
    Collection4     56ms     0ms     56ms
    Collection2     54ms    54ms      0ms
    Collection1      2ms     2ms      0ms
    

    Collection2和Collection3中的findOne如何在Collection1中花费大约50毫秒,光标迭代只需要2ms?

    这真的加起来,最后我得到了很长的处理时间。我做错了什么以及如何降低findOne查询时间?

    此外,如果不是将findOne嵌套在游标中并循环遍历集合,如果我尝试仅通过参数链接1条记录,则findOne需要~1 ms。

    在游标中嵌套mongoose查询不是一个好的策略吗?

0 个答案:

没有答案