3

这是这个问题的具体原因:

db.collection.findOne() 函数记录为:

“如果多个文档满足查询,则该方法按照反映磁盘上文档顺序的自然顺序返回第一个文档”。

根据http://docs.mongodb.org/manual/reference/method/cursor.sort/#mmapv1,这种自然顺序的概念似乎只适用于MMAPv1,不适用于wiredTiger。

然后,我想知道将 db.collection.findOne() 与wiredTiger 一起使用是否将始终返回与搜索条件匹配的第一个索引文档(具有最低_id 索引的文档)。

-> 然后 findOne() 将等同于 "findFirst() 根据 _id" ,并且将保证排序:正确吗?

谢谢,

朱利安

4

2 回答 2

2

我不必担心究竟是什么定义了自然顺序,而是将其视为“数据库在那一刻想要做的任何事情”。您永远不应该依赖自然顺序,因为您几乎无法保证它将如何返回文档,尤其是在比较存储引擎时。这不是基于插入时间的顺序,尽管它可能是;它不是基于磁盘位置的顺序,尽管它可能是;并且它不是基于 的订单_id,尽管它可能是。它只是返回文档,但是实施者根据没有请求特定的顺序来决定是最好的还是最简单的,因此它被称为“自然”。由于它是一个实现细节,它可以随时更改。

我想知道是否将 db.collection.findOne() 与wiredTiger 一起使用将始终返回与搜索条件匹配的第一个索引文档(具有最低_id 索引的文档)

不。如果你想要最小的 _id,明确地按升序 _id 排序并取第一个结果。你总是有这个_id索引。

于 2015-04-07T15:56:11.047 回答
-1

自然意味着按插入顺序,而不是按 id 顺序。 文档并没有说它不适用于 WiredTiger,所以我认为它也适用于这个存储引擎:

使用 $natural 运算符对排序操作的结果使用自然顺序。自然顺序是指数据库内部文档的逻辑顺序。

于 2015-04-07T12:57:31.797 回答