MongoDB如何在一个集合中订购他们的文档?

Pao*_*a G 17 sorting mongodb mongodb-query

在我的User集合中,MongoDB通常按照我创建的顺序对每个新文档进行排序:创建的最后一个是集合中的最后一个.但我已经检测到另一个集合,其中我创建的最后一个集合在27个文档之间具有6个位置.

这是为什么?

MongoDB集合中的每个文档都遵循哪个顺序?

Ion*_*zău 23

它被称为自然顺序:

natural order

数据库引用磁盘上文档的顺序.这是默认的排序顺序.见$naturalReturn in Natural Order.

这证实了一般情况下,你按照你输入的顺序得到它们,但是不能保证 - 正如你所注意到的那样.

以自然顺序返回

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

索引使用

包含按$natural顺序排序的查询使用索引来满足查询谓词,但具有以下异常:如果查询谓词在_id字段上是相等条件{ _id: <value> },则按$natural顺序排序的查询可以使用_id索引.

MMAPv1

通常,自然顺序反映了插入顺序,MMAPv1存储引擎具有以下例外.对于MMAPv1存储引擎,如果文档由于文档增长而重新定位或者删除操作释放空间然后由新插入的文档占用,则自然顺序不反映插入顺序.

很显然,像文档提到的,你应该依靠此默认顺序(此排序是内部实现的功能,你不应该依赖于其中的任何特定结构.).

如果需要对事物进行排序,请使用排序解决方案.


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

db.mycollection.find().sort({ "$natural": 1 })
db.mycollection.find()
Run Code Online (Sandbox Code Playgroud)

如果您想按其他字段排序(例如name),您可以这样做:

db.mycollection.find().sort({ "name": 1 })
Run Code Online (Sandbox Code Playgroud)


Phi*_*ipp 6

出于性能原因,MongoDB 从不拆分硬盘驱动器上的文档。

当您从一个空集合开始并开始将一个又一个文档插入其中时,mongoDB 会将它们连续放置在磁盘上。

但是当你更新一个文档并且它现在占用更多空间并且不再适合它的旧位置而不与下一个重叠时会发生什么?在这种情况下,MongoDB 将删除它并在集合文件的末尾重新附加它作为一个新的。

您的收藏文件现在有一个未使用的空间。这很浪费,不是吗?这就是为什么下一个插入且足够小以适合该孔的文档将插入该孔的原因。这可能是您的第二个收藏中发生的情况。

底线:永远不要依赖按插入顺序返回的文档。当您关心顺序时,请始终对结果进行排序。