【问题标题】:Index vs Aggregation Pipeline for Sorting用于排序的索引与聚合管道
【发布时间】: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


【解决方案1】:

在问题的上下文中,更好的选择是聚合,因为它明确指定了排序

在查询示例中,结果按索引指定的顺序返回,因为查询正在使用索引{ num: 1, marked: 1, value: 1}。但是,查询中指定的任何内容都不能保证排序,这意味着结果可能会在将来的某个时候发生变化。例如,考虑要创建索引{ num: 1, marked: 1, updated_at: 1 } 的情况。查询规划器可能决定改用此索引,这可能导致结果的顺序不同。

在没有排序的情况下,查询将按照所使用的索引的顺序返回结果,但您不应该在没有明确指定的情况下依赖该顺序。引用docs

除非您指定 sort() 方法或使用 $near 运算符, MongoDB不保证查询结果的顺序。

【讨论】:

  • 哇,非常感谢,它清除了这个论点并提供了充分的理由。非常感谢@AdamHarrison
  • 很高兴能帮上忙!
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2014-05-11
  • 2020-09-20
  • 2021-06-29
  • 2020-11-11
相关资源
最近更新 更多