我已经阅读了一些消息称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()
一致。
答案 0 :(得分:17)
两者同样快。
执行find().limit(1)
时,不会向服务器发送任何查询。您只需准备查询客户端。只要您不检索任何文档,您仍然可以修改光标,从而查询(例如通过添加sort
)。
因此,如果仅对find().limit(1)
进行基准测试,您会发现它的速度要快得多,因为查询未执行。可以说你正在对无用的代码进行基准测试。
答案 1 :(得分:9)
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