【发布时间】:2019-09-06 01:09:41
【问题描述】:
我正在开发一个使用 MongoDB 作为其数据库的应用程序,对于排序数据,我遇到了一位同事的一个有趣的论点,即可以使用索引而不是聚合管道来获取排序的数据。
我试过了,它确实有效;使用具有指定字段和方向的索引在查询时会返回排序数据。在使用聚合管道时,我也得到了同样的结果。
我创建了一个具有以下规范的索引:
index name: batch_deleted_a_desc
num: asc
marked: asc
value: desc
使用聚合管道:
> db.test.aggregate([{$match: {num:"3",marked:false}}, {$sort:{"value":-1}}])
{ "_id" : ObjectId("5d70b40ba7bebd3d7c135615"), "value" : 4, "marked" : false, "num" : "3" }
{ "_id" : ObjectId("5d70b414a7bebd3d7c135616"), "value" : 2, "marked" : false, "num" : "3" }
{ "_id" : ObjectId("5d70b3fea7bebd3d7c135614"), "value" : 1, "marked" : false, "num" : "3" }
使用索引:
> db.test.find({num:"3",marked:false})
{ "_id" : ObjectId("5d70b40ba7bebd3d7c135615"), "value" : 4, "marked" : false, "num" : "3" }
{ "_id" : ObjectId("5d70b414a7bebd3d7c135616"), "value" : 2, "marked" : false, "num" : "3" }
{ "_id" : ObjectId("5d70b3fea7bebd3d7c135614"), "value" : 1, "marked" : false, "num" : "3" }
如您所见,结果是相同的。但我不确定使用索引来获取排序数据是一种好习惯,但使用聚合管道(有时)比仅仅创建索引需要更多的努力。
那么,哪个是最好的选择?
【问题讨论】:
-
“使用索引”部分下的查询未指定排序,这是有意的吗?聚合以及普通查询都可以使用索引来提高过滤和排序的性能 (docs.mongodb.com/manual/core/aggregation-pipeline/…)。
-
是的,“使用索引”部分下的查询没有指定排序以证明索引按照索引的规范进行排序。
-
另外,我同意索引可用于提高性能,但不能用于排序本身,在这种情况下,它确实如此。那么使用索引或聚合管道进行排序的最佳选择应该是什么?谢谢@AdamHarrison
标签: mongodb sorting aggregation-framework mongodb-indexes