MongoDB 的 find 和 findone 调用的区别

Woj*_*ech 37 mongodb

我正在处理一个项目,我不确定find光标的工作方式和光标的工作方式之间是否存在差异findOne。findOne 只是一个包装器find().limit(1)吗?我一直在寻找它,也许有人知道 mongodb 是否有特殊的方法。如果这有所作为,我正在使用 mongodb 的 PHP API。

Lef*_*ium 36

根据我自己的基准,find().limit(1)是数量级的速度findOne()

MongoDB 文档中存在错误或findOne(). findOne()执行更像是find().limit(N)其中 N 是查询将返回的文档数。我在试图弄清楚为什么我的简单查询如此缓慢时发现了这一点!

更新:来自 10gen (MongoDB) 工程师的回应:

您正在执行的两个查询非常不同。find 查询返回一个游标,这本质上是一个无操作场景,因为没有返回实际数据(只有游标信息)。如果您调用 findOne,那么您实际上是在返回数据并关闭游标。文档肯定应该更清楚:-)

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

  • Leftium,我会编辑您的答案,以强调当您实际检索文档(通常会这样做)时,这两个功能实际上是相同的,正如文档所述。现在,有人可能会阅读您答案开头的粗体行并得出结论,如果他们想检索一个文档,`findOne()` 比 `find().limit(1)` 更糟糕,这是不正确的。 (3认同)
  • @WojonsTech:JS 中的快速基准测试表明 findOne() 实际上更快。不过,结果可能因驱动程序/平台而异。例如,我无法重现最初使用 Java 驱动程序观察到的 JS 中数量级的速度差异。 (2认同)

Nic*_*mas 8

findOne()的确是语法糖find().limit(1)因为你实际上检索文档(而不是仅仅返回光标find())。

有关更多详细信息,请参阅Leftium 的回答和更新。