【问题标题】:What's faster: `find().limit(1)` or `findOne()` in MongoDB/Mongoose?哪个更快:MongoDB/Mongoose 中的`find().limit(1)` 或`findOne()`?
【发布时间】:2020-04-13 14:38:45
【问题描述】:

我读过资料说 MongoDB 的 findOne()find().limit(1) 慢得多,但我也听说过其他情况。当前的真相究竟是什么?

Article from March 2013: “使用 find() + limit() 明显更快,因为 findOne() 将始终读取并返回文档(如果存在)。find() 只返回一个游标(或不返回)并且只读取遍历游标时的数据。”

SE answer from 2011: “如果检索到 find().limit(1) 文档,数量级的速度差异似乎消失了。另外,我无法用 MongoDB JavaScript 驱动程序重现主要的速度差异。我最初使用 MongoDB Java 驱动程序进行基准测试。”

希望无论答案是什么,也和使用猫鼬的find().sort().limit(1)findOne()一致。

【问题讨论】:

    标签: javascript node.js performance mongodb mongoose


    【解决方案1】:

    两者都同样快。

    当您执行find().limit(1) 时,不会向服务器发送任何查询。您只需准备查询客户端。只要您不检索任何文档,您仍然可以修改光标,从而修改查询(例如通过添加sort)。

    因此,如果您只对 find().limit(1) 进行基准测试,您会发现它要快得多,因为不会执行查询。可以说你是在对无用的代码进行基准测试。

    【讨论】:

      【解决方案2】:

      db.collection.findOne() 对比 db.collection.find().limit(1)

      • find() 返回光标,而findOne() 返回精确文档
      • 使用find() + limit() 更快,因为findOne() 将始终读取+返回文档(如果存在)。
      • find() 只返回一个 cursor(或不返回)并且只在您遍历游标时读取数据。
      • find() 有一个cursor,因此您可以在 mongo shell 中将explain() 与您的查询一起使用,以查看您的query 执行的获胜计划和其他详细信息。

      额外:limit(-1)limit(0)

      • limit() 值为 0(即 .limit(0))相当于设置 无限制
      • 负限制与正限制类似,但在返回一批结果后会关闭光标。

      更多信息可以参考官方区块:http://docs.mongodb.org/manual/reference/method/cursor.limit/]1

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 2010-11-02
        • 2013-12-04
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 2018-06-09
        • 1970-01-01
        • 2021-02-15
        相关资源
        最近更新 更多