【问题标题】:How can I specify the natural ordering in MongoDB?如何在 MongoDB 中指定自然顺序?
【发布时间】:2012-07-14 22:29:53
【问题描述】:

有没有办法在 mongodb 中指定数据的自然排序,类似于主索引如何在 RDBMS 表中对数据进行排序?

我的用例是我的所有查询都返回按日期字段排序的数据,比如生日。根据MongoDB: Sorting and Natural Order,标准(无上限)集合的自然顺序大致是插入顺序,但不能保证。这意味着在检索数据后需要进行排序。

【问题讨论】:

标签: mongodb


【解决方案1】:

如果您正在寻找类似于 RDBMS 中的主索引的东西,请按 _id 排序。由于 _id 以时间戳为前缀,因此将大致为插入顺序。如果您尝试使用 $natural 顺序,它将导致它丢失索引。

【讨论】:

  • 抱歉造成混淆,我已更新我的帖子以明确表示我不希望按插入日期对数据进行排序。我很想知道是否有一种方法来定义排序操作​​的自然顺序是不需要的。
【解决方案2】:

另外,我要补充一点,您应该考虑使用文档 ID 中的内置时间戳,而不是依赖单独的日期字段,因为它允许您存储更少的数据并删除索引。

杰森 蒙古总部

【讨论】:

  • 感谢您的回答。对不起,我不清楚我的问题。我不想按插入时间对文档进行排序
【解决方案3】:

我想如果没有索引的帮助,很难实现你想要的。为了支持分片,MongoDB 中的 _id 字段基于文档创建时的时间戳取值。因此,与 RDBMS 表中的标识列不同,您不能让它们单调递增。如果所有查询都返回按出生日期排序的文档,我认为您必须在 Birthdate 列上创建一个索引。创建索引后,查询变得足够高效..
参考这个:
MongoDB capped collection and monotically increasing index

【讨论】:

  • 需要明确的是,default ObjectIDs 并非旨在“支持分片”,通常do not 会创建一个good shard key
  • 同意。它将导致所有新数据敲击一个特定的分片。换句话说,数据分布将遵循时间分布,这并没有真正的帮助..
【解决方案4】:

我相信您指的是clustered index,而不是主索引。

MongoDB 2.0 没有聚集索引功能,因此regular index on date 将是您最有效的检索选项。

使用 MongoDB 考虑磁盘上的物理顺序可能还为时过早。 MongoDB 使用内存映射文件,因此根据您的工作集 + 查询 + RAM,您可能不需要像预期的那样频繁地从磁盘加载数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多