从 MongoDb 集合中检索记录时,记录是不是根据为该集合设置的索引排序?

Posted

技术标签:

【中文标题】从 MongoDb 集合中检索记录时,记录是不是根据为该集合设置的索引排序?【英文标题】:When retrieving records from a MongoDb collection, do the records come back sorted based on the index that was set up for that collection?从 MongoDb 集合中检索记录时,记录是否根据为该集合设置的索引排序? 【发布时间】:2012-11-01 18:16:54 【问题描述】:

我有一个看起来像这样的案例: 我有一个名为“Test”的集合,我为它设置了一个索引,索引看起来像这样:


 "A" : 1,
 "B" : 1,
 "C" : 1

在我的代码中,我正在检索基于“A”是某个值的记录:

List<Test> tests = Test.Find(Query.EQ("A", CertainValue)).ToList();

令我惊讶的是,所有记录都按索引中提到的顺序排序(“B”升序,然后“C”升序)

我想知道这种行为是否总是意料之中,记录是否总是会根据索引进行排序,还是我只是在想象一些东西,而这只是一个偶然的案例?

PS。记录未输入到排序的集合中,因此这不是记录的自然顺序。

【问题讨论】:

【参考方案1】:

就像许多其他字典实现一样,order in database is not defined or guaranteed (except for capped collections) 并且随时可能更改:

“自然顺序”定义为数据库的本机排序 集合中的对象。

执行不带参数的 find() 时,数据库返回 对象按自然顺序排列。

对于标准表格,自然顺序并不是特别有用,因为, 尽管该顺序通常接近于插入顺序,但它不是 保证是。然而,对于 Capped Collections,自然顺序是 保证是广告订单。

如果您需要以某种方式对它们进行排序,请使用显式排序,或者参考您的特定驱动程序 (C#) 实现文档以查看它是否为您排序。

【讨论】:

感谢您的回答。我对如何从 MongoDB 检索数据进行了更多实验,您是对的,不能保证顺序。例如,如果我尝试根据属性“B”查找记录,则结果是根据“C”而不是“A”排序的。所以我最终自己整理了一下:Test.Find(Query.EQ("A", CertainValue)).SetSortOrder(SortBy.Ascending("B", "C")).ToList();

以上是关于从 MongoDb 集合中检索记录时,记录是不是根据为该集合设置的索引排序?的主要内容,如果未能解决你的问题,请参考以下文章

检索每个组中的最后一条记录 - MongoDB

从 mongodb 集合中获取最新记录

MongoDB:仅检索特定记录[重复]

使用limit和skip从mongoDB中的两个集合中获取记录

如何使用 PyMongo 基于 Flask URL 变量检索 MongoDB 中的记录?

无法使用 presto 从 mongodb 获取记录