Mongo 2.6查询结果顺序

时间:2014-06-19 05:46:02

标签: mongodb mongodb-query

如果查询结果包含单个索引,则不会按照插入顺序维护订单。 如果mongo Query包含复合索引,结果数据顺序是否会按照插入顺序维护?

3 个答案:

答案 0 :(得分:3)

如果你有一个唯一的索引没关系,MongoDB不会按照插入顺序返回,除非你用一个代表插入顺序的索引排序(唯一索引实际上不是,它是一种特殊类型索引)。

相反,它将以自然顺序返回(实际上不是$natural,因为这是一种磁盘顺序)。

这个自然顺序实际上是内部链接列表指定的顺序,正如我在这里实际解释的那样:Mongo 2.6 indexing - query result order和@kwolfe解释了如何实际获得排序结果。

答案 1 :(得分:1)

所选索引将取决于查询中使用的字段,结果的顺序将由索引排序反映。

所以使用这样的数据:

{ "a": 5, "b:" 2 }
{ "a": 5, "b": 1 }
{ "a": 1, "b": 7 }

复合指数:

db.collection.ensureIndex({ "a": 1, "b": 1 })

可以使用此索引的查询将按结果中的索引对字段进行排序:

{ "a": 1, "b": 7 }
{ "a": 5, "b": 1 }
{ "a": 5, "b:" 2 }

如果您想保留广告订单,则可以使用.sort()中的$natural修饰符:

db.collection.find({ a: { "$gte": 1 } }).sort({ "$natural": 1 })

按照如何在磁盘上找到文档进行排序。或者您只需将_id指定为"排序"

db.collection.find({ a: { "$gte": 1 } }).sort({ "_id": 1 })

这将强制结果的顺序通过_id键维持其插入顺序,并且它的值会增加。当然要求这是真的,如果你使用默认的ObjectId实现它应该是。

答案 2 :(得分:1)

如果您需要保留集合中的插入顺序,则需要使用上限集合。对于上限集合,MongoDB会自动保留插入顺序。

来自capped collection文档:

  • 上限集合可保证插入订单的保留。因此,查询不需要索引来按插入顺序返回文档。如果没有这种索引开销,它们可以支持更高的插入吞吐量。

  • 上限集合保证插入顺序与磁盘上的顺序(自然顺序)相同,并通过禁止增加文档大小的更新来实现。封顶集合仅允许符合原始文档大小的更新,这可确保文档不会更改其在磁盘上的位置。

  • 加盖的集合会自动删除集合中最旧的文档,而无需脚本或显式删除操作。

但是上限集合有一些主要缺点:

  • 您必须预定义集合的大小
  • 您无法从上限集合中删除文档(您只能从集合中删除所有文档)
  • 您可以更新文档,但更新不会导致文档增长