$or在$match中使用时mongodb会使用索引排序吗?

问题描述 投票:0回答:1

复合指数

{
  A: 1,
  timestamp: 1,
}

and 

{
  B: 1,
  timestamp: 1,
}
db.user.aggregate([
  { $match: {
      $or: [ { A: "some_value" }, { B: "some_value" } ]
  } },
  {
    $sort: {
      timestamp: 1
    }
  },
  {
    $limit: 1000
  }
])

问题是,

$sort
$limit
阶段会因为
$or
中的
$match
而成为阻塞阶段吗?

如果没有

$or
,我知道索引将用于执行排序。

node.js mongodb mongodb-query aggregation-framework mongodb-indexes
1个回答
0
投票

我认为更好的表达问题的方式是:

索引能否提供所请求的排序,从而防止数据库处理此聚合时出现阻塞阶段?

我这么说并强调“可以”的原因是因为通常无法保证数据库优化器的计划选择。因此,了解它的能力以及在某种程度上了解该方法的好处通常是有益的,以便适当地推理可能发生的情况。

不同意

评论中的回答,重新表述的问题的答案是数据库可以确实使用索引来提供排序。将您的示例放入 this mongoplayground 示例 会生成一个 explain

 计划,其中包括 
SORT_MERGE
 阶段。这是一个流变体,它组合了按请求顺序扫描两个索引的排序序列。

这在

此处的文档中得到了直接确认,其中指出:

$或和排序操作 当使用 $or

 执行 
sort()
 查询时,MongoDB 可以使用支持 
$or
 子句的索引。

再次强调,仅仅因为系统

可以这样做并不意味着它总是将会。有许多因素,特别是 $or

 运算符中的子句数量,会影响选择此类计划的可能性。

© www.soinside.com 2019 - 2024. All rights reserved.