索引 MongoDB 以实现排序一致性

问题描述

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 }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...