MongoDB如何在一个集合中对文档进行排序?

MongoDB如何在一个集合中对文档进行排序?,mongodb,sorting,mongodb-query,Mongodb,Sorting,Mongodb Query,在我的用户集合中,MongoDB通常按照我创建的顺序对每个新文档进行排序:最后创建的文档是集合中的最后一个文档。但我检测到另一个集合,我创建的最后一个集合在27个文档之间有6个位置 为什么呢 MongoDB集合中的每个文档后面的顺序是什么?它被称为: 数据库引用磁盘上文档的顺序。这是默认的排序顺序。见和 这证实了一般情况下,您会按照插入的顺序获取它们,但这并不能保证,正如您所注意到的 该参数根据项目在数据库中的位置返回项目。这种排序是一种内部实现特性,您不应该依赖于其中的任何特定结构 包含按顺序

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

为什么呢

MongoDB集合中的每个文档后面的顺序是什么?

它被称为:

数据库引用磁盘上文档的顺序。这是默认的排序顺序。见和

这证实了一般情况下,您会按照插入的顺序获取它们,但这并不能保证,正如您所注意到的

该参数根据项目在数据库中的位置返回项目。这种排序是一种内部实现特性,您不应该依赖于其中的任何特定结构

包含按顺序排序的查询不使用索引来实现查询谓词,但以下情况除外:如果查询谓词是
\u id
字段
{\u id:}
上的相等条件,则具有按顺序排序的查询可以使用
\u id
索引

通常,自然顺序反映插入顺序,但MMAPv1存储引擎除外。对于MMAPv1存储引擎,如果文档因操作而重新定位或删除操作释放了空间(这些空间随后被新插入的文档占用),则自然顺序不会反映插入顺序

显然,与前面提到的文档一样,您应该依赖此默认顺序(此顺序是内部实现功能,您不应该依赖其中的任何特定结构)

如果需要排序,请使用


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

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

db.mycollection.find().sort({ "name": 1 })
MongoDB根本不会“订购”文档,除非您要求

基本插入将在
\u id
主键值中创建一个,除非您要求它执行其他操作。此
ObjectId
值是一个特殊值,具有或“不断增加”属性,这意味着创建的每个值都保证大于最后一个值

如果要“排序”,则执行显式“排序”:

db.collection.find().sort({“\u id”:1})
或按存储在磁盘上的顺序排序:

db.collection.find().sort({“$natural”:1})
这几乎是标准,除非另有说明,或者由确定排序顺序的查询条件选择“索引”。但是,如果查询条件选择了以其他方式排序的索引,则可以使用它来“强制”该顺序


MongoDB文档在增长时会“移动”,因此,
\u id
顺序并不总是与检索文档的顺序明确相同。

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

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

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

您的集合文件现在有一个未使用的空间洞。这真是浪费,不是吗?这就是为什么插入的下一个文件足够小,可以放入该孔中,将插入该孔中。这可能就是你第二次收藏的情况


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

多亏了提供的链接,我可以了解更多信息

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


通常,自然顺序反映插入顺序,但MMAPv1存储引擎除外。对于MMAPv1存储引擎,如果由于文档增长或删除操作而重新定位文档,则自然顺序不反映插入顺序,因为新插入的文档占用了空间。”

我改进了我的答案——如果能打分,我将不胜感激<代码>:-)显然,您不应该依赖这种排序。干杯我做到了:)。再次感谢!谢谢,但请单击
按钮。这就是我所说的标记的意思。:)谢谢你做到了吗干杯
db.mycollection.find().sort({ "name": 1 })