在我的User系列中,MongoDB通常按照我创建新文档的相同顺序对每个新文档进行排序:最后创建的文档是该系列中的最后一个.但我发现了另一个集合,我创建的上一个集合在27个文档之间有6个位置.

为什么?

MongoDB collection中每个文档的顺序是什么?

推荐答案

它叫自然秩序:

自然秩序

数据库引用磁盘上文档的顺序.这是默认的排序顺序.见$natural回归自然.

这证实了,通常情况下,你会按照插入的顺序获取它们,但这并不能保证——正如你所注意到的那样.

回归自然

$natural参数根据数据库中的自然秩序返回项目.这种排序是一种内部实现功能,您不应该依赖其中的任何特定 struct .

索引使用

包含按$natural顺序排序的查询不使用索引来实现查询谓词,但以下情况除外:如果查询谓词是_id字段{ _id: <value> }上的相等条件,则按$natural顺序排序的查询可以使用_id索引.

MMAPv1

通常,自然顺序反映插入顺序,但MMAPv1存储引擎除外.对于MMAPv1存储引擎,如果文档因document growth次或删除操作而重新定位,则自然顺序不会反映插入顺序,因为新插入的文档会占用空间.

显然,就像上面提到的文档一样,您应该依赖于这个默认顺序(This ordering is an internal implementation feature, and you should not rely on any particular structure within it.).

如果你需要分类,使用sort solutions.


基本上,以下两个调用应该以相同的顺序返回文档(因为默认顺序是$natural):

db.mycollection.find().sort({ "$natural": 1 })
db.mycollection.find()

如果要按另一个字段(例如name)排序,可以执行以下操作:

db.mycollection.find().sort({ "name": 1 })

Mongodb相关问答推荐

MongoDB 在一个聚合中包含多个组

MongoDB 使用 pymongo 收集 500K 文档的写入速度很差

对 MongoDB 集合中的对象数组进行排序

Mongoose 更新不同类型的记录

使用 $addFields 将字段添加到 $lookup 结果中的每个项目

用Golang减go mongodb中的两个字段

Mongo C#忽略属性

MongoDB 列表 - 获取每第 N 个元素

是否可以迭代 mongo 游标两次?

MongoDB 更改流副本集限制

如何使用python将csv数据推送到mongodb

NoSql 参考数据

如何返回 MongoDB 中文档的 ObjectId 或 _id?和错误$in 需要一个数组

使用 MongoDB 进行嵌套分组

C# mongodb driver 2.0 - 如何在批量操作中更新插入?

如何使用 MongoDB Compass 对数据进行排序

带有 Java 驱动程序的 MongoDB 聚合

MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

MongoDb 连接被拒绝

在 MongoDB 中比较日期(moment.js)