问题描述
MongoDB documentation 表示 MongoDB 不会以特定顺序将文档存储在集合中。所以如果你有这个集合:
db.restaurants.insertMany( [
{ "_id" : 1,"name" : "Central Park Cafe","borough" : "Manhattan"},{ "_id" : 2,"name" : "Rock A Feller Bar and Grill","borough" : "Queens"},{ "_id" : 3,"name" : "Empire State Pub","borough" : "brooklyn"},{ "_id" : 4,"name" : "Stan's Pizzaria",{ "_id" : 5,"name" : "Jane's Deli",] );
并像这样排序:
db.restaurants.aggregate(
[
{ $sort : { borough : 1 } }
]
)
那么排序顺序可能不一致,因为:
行政区字段包含曼哈顿和布鲁克林的重复值。文档按自治市镇的字母顺序返回,但具有自治市镇重复值的文档的顺序在多次执行相同排序时可能不同。
db.restaurants.aggregate(
[
{ $sort : { borough : 1,_id: 1 } }
]
)
我的问题与此类查询的效率有关。假设您有数百万个文档,是否应该创建一个复合索引(例如 { borough: 1,_id: -1 }
)以使其高效?还是由于 { borough: 1 }
字段的潜在特殊性质而将 _id
编入索引就足够了?
我使用的是 MongoDB 4.4。
解决方法
如果您需要稳定排序,则必须对两个字段进行排序,而对于高性能查询,您需要在两个字段上都有一个复合索引。
{ borough: 1,_id: -1 }