如果查询结果包含单个索引,则不会按照插入顺序维护订单。 如果mongo Query包含复合索引,结果数据顺序是否会按照插入顺序维护?
答案 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文档:
上限集合可保证插入订单的保留。因此,查询不需要索引来按插入顺序返回文档。如果没有这种索引开销,它们可以支持更高的插入吞吐量。
上限集合保证插入顺序与磁盘上的顺序(自然顺序)相同,并通过禁止增加文档大小的更新来实现。封顶集合仅允许符合原始文档大小的更新,这可确保文档不会更改其在磁盘上的位置。
加盖的集合会自动删除集合中最旧的文档,而无需脚本或显式删除操作。
但是上限集合有一些主要缺点: