以下是此问题的具体原因:
db.collection.findOne()函数记录为:
" 如果多个文档满足查询,此方法将根据自然顺序返回第一个文档,该文档反映了磁盘上文档的顺序&# 34。
根据http://docs.mongodb.org/manual/reference/method/cursor.sort/#mmapv1,这种自然顺序的概念似乎只适用于MMAPv1而不适用于wiredTiger。
然后,我想知道使用带有wiredTiger的db.collection.findOne()是否总是返回与搜索条件匹配的第一个索引文档(具有最低_id索引的文档)。
- >然后根据_id" findOne()等同于" findFirst(); ,并且将保证订购:这是正确的吗?
谢谢,
于连
答案 0 :(得分:0)
自然意味着按插入顺序,而不是按照id的顺序。 The doc并不表示它不适用于WiredTiger,因此我认为它也适用于此存储引擎:
使用$ natural运算符对排序操作的结果使用自然顺序。自然顺序是指数据库内部文档的逻辑顺序。
答案 1 :(得分:0)
我不会担心究竟是什么定义了自然顺序,而是将其视为"无论数据库想要在那个时刻做什么"。您永远不应该依赖于自然顺序,因为您几乎无法保证它将如何返回文档,尤其是在您比较存储引擎时。它不是基于插入时间的订单,尽管它可能是;它不是基于磁盘上位置的订单,尽管它可能是;并且它不是基于_id
的订单,尽管它可能是。它只返回文档,但实施者根据没有请求的特定订单决定是最好的还是最简单的,因此它被称为" natural"。由于它是一个实现细节,它可能随时改变。
我想知道使用带有wiredTiger的db.collection.findOne()是否总会返回与搜索条件匹配的第一个索引文档(具有最低_id索引的文档)
没有。如果你想要最小的_id,请在升序_id上显式排序并获取第一个结果。您始终拥有_id
索引。