从 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 集合中检索记录时,记录是不是根据为该集合设置的索引排序?的主要内容,如果未能解决你的问题,请参考以下文章
使用limit和skip从mongoDB中的两个集合中获取记录