什么更快:MongoDB / Mongoose中的`find()。limit(1)`或`findOne()`?

时间:2015-10-15 19:16:35

标签: javascript node.js performance mongodb mongoose

我已经阅读了一些消息称MongoDB的findOne()find().limit(1)慢得多,但之后我也听到了其他消息。实际上当前的真相是什么?

Article from March 2013:"使用find()+ limit()要快得多,因为如果文件存在,findOne()将始终读取+返回文档。 find()只返回一个游标(或不返回),只有在遍历游标时才会读取数据。"

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

我希望无论答案是什么,它都与使用Mongoose的find().sort().limit(1)findOne()一致。

2 个答案:

答案 0 :(得分:17)

两者同样快。

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

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

答案 1 :(得分:9)

db.collection.findOne() db.collection.find()。limit(1)

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

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

  • limit()的值为0(即。limit(0))等效于设置无限制
  • 负极限类似于正极限,但是在返回单批结果后关闭光标。

有关更多信息,您可以参考以下官方说明:http://docs.mongodb.org/manual/reference/method/cursor.limit/] 1