【问题标题】:WiredTiger MongoDB engine ordering : Is" natural order" equivalent to "ordered" with WiredTiger engine in mongodb?WiredTiger MongoDB 引擎排序:“自然顺序”是否等同于 MongoDB 中 WiredTiger 引擎的“排序”?
【发布时间】:2015-04-07 23:56:11
【问题描述】:

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

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

"如果有多个文档满足查询,则该方法根据自然顺序返回第一个文档,这反映了文档在磁盘上的顺序"。

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

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

-> 那么 findOne() 将等价于 "findFirst() 根据 _id" ,并保证排序:正确吗?

谢谢,

朱利安

【问题讨论】:

    标签: mongodb wiredtiger


    【解决方案1】:

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

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

    没有。如果您想要最小的 _id,请显式按升序 _id 排序并获取第一个结果。您始终拥有 _id 索引。

    【讨论】:

    • 这回答了我的问题,因为我知道我将无法依赖自然顺序。谢谢
    【解决方案2】:

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

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

    【讨论】:

    • 来自doc的自然意思:数据库引用磁盘上文档的顺序
    • 对不起,公式不好或不清楚,但它似乎没有回答我的问题。从文档自然的意思是:“数据库引用磁盘上文档的顺序”据我所知插入顺序不同。在 MMAPv1 中,由于内存映射文件和文档的潜在重新分配,插入顺序不会被保留。此外,我 - 经验 - 认为 _id 的顺序与插入顺序有关,尽管我必须承认我不知道 mongo 是否重用已删除文档的 id)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多