【发布时间】:2016-07-29 04:39:32
【问题描述】:
这是this question 的后续行动 - 请参阅上下文。
这个问题涉及链接问题的几个特殊情况 - 即使用 $in 或 $or 运算符时 MongoDB 中的排序如何工作,以及如何确保使用索引进行排序与内存排序.
$in:
例如,假设我们有一个文档结构所在的集合
{a: XXX, b: XXX}
...我们在a 和b 上有一个复合索引,并希望运行查询
{a: {$in: [4, 6, 2, 1, 3, 10]}, b: {$gt: 1, $lt: 6}}
如果在a 或b 上进行排序,将如何进行? $in 是排序的相等运算符,但在我看来,即使这样,对 b 进行排序也是不可能的。我认为,只有首先对 $in 值数组进行排序,才能使用索引对 a 进行排序 - 但我不知道 MongoDB 是否这样做。
$或:
由于$or 查询,IIUC 被作为多个查询处理,并且可能使用它们各自的索引进行排序,排序后的结果是否会以某种方式合并,或者$or 是否强制对所有结果进行内存排序?如果是前者,这个过程的时间复杂度是多少?
【问题讨论】:
-
到底是什么问题?您是在问
$or或$in如何影响排序的“索引”选择?还是你在问别的?您确实意识到“查询”阶段也可以使用一个(甚至是一对带有交集的)索引,而“排序”阶段也可以使用不同的索引。 -
@NeilLunn - 嘿,尼尔,这个问题在这一点上有一个答案,所以我认为你评论的第一部分是没有实际意义的,但关于后一部分,根据this answer 它实际上并不是可以在一个索引上查询并在完全不同的索引上排序。
-
说 “不可能” 实际上并不正确,因为 “可能” 与查询优化器认为的内容之间存在明显差异“最佳”。但是下面给出的答案对出现的常见情况给出了相当合理的解释。
-
@NeilLunn 我对链接答案的解释是,无法对不同的索引、周期进行查询和排序,优化器永远无法做到这一点。特别是我正在查看后续问题更新部分第 1 部分:“您不能有两个单独的索引 {a:1} 和 {b:1},并期望 {a: 1} 索引用于相等部分,{b:1} 索引用于排序部分。在这种情况下,MongoDB 将选择两个索引之一。"
-
好吧,无论您选择哪种方式看待它,您的“解释”或“答案”都不完全正确。
标签: mongodb sorting indexing time-complexity