【问题标题】:Mongodb toArray() performanceMongodb toArray() 性能
【发布时间】:2013-03-31 03:12:22
【问题描述】:

我有一个包含 727000 个文档的集合“匹配”。它内部有 6 个字段,没有数组,只有简单的整数和对象 ID。我正在对集合进行如下查询:

matches.find({
  $or: [{
      homeTeamId: getObjectId(teamId)
    }, {
      awayTeamId: getObjectId(teamId)
    }
  ],
  season: season,
  seasonDate: {
    '$gt': dayMin,
    '$lt': dayMax
  }
}).sort({
  seasonDate: 1
}).toArray(function (e, res) {
  callback(res);
});

结果仅返回大约 7-8 个文档。 查询大约需要 100 毫秒,我认为这很合理,但主要问题是,当我调用方法 toArray() 时,它增加了大约 600 毫秒! 我在笔记本电脑、Intel Core I5、6GB RAM 上运行服务器,但我不敢相信它为 7-8 个文档增加了 600 毫秒。 尝试使用 mongodb-native 驱动程序,现在切换到 mongoskin,仍然得到同样缓慢的结果。 有什么建议吗?

【问题讨论】:

  • callback() 是做什么的?
  • 从函数返回数据。我已将此查询包装在函数 exports.getPrevNextMatches = function(teamId, callback){} 中。但是,当我在没有 toArray() 方法的情况下执行相同操作时,要返回结果游标,如上所述,它需要约 100 毫秒。 toArray() 方法增加了 ~600ms
  • 您是否在find 结果上尝试了forEach 而不是toArray?我怀疑它会有所帮助,但这是一件容易尝试的事情。另外,explain 为您提供的查询是什么?

标签: node.js mongodb nosql


【解决方案1】:

toArray() 方法迭代抛出所有游标元素并将它们加载到内存中,这是一个成本很高的操作。也许您可以添加索引来提高查询性能,和/或避免 toArray 迭代自己抛出光标。

问候, 莫西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多