mongodb 不使用索引,除非在 $match 中指定了字段

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

复合指数

{
  A: 1,
  B: 1
}

在这个查询中,没有使用复合索引:

db.user.aggregate([
  { $match: {
      B: { $gt: 100 }
  } },
  {
    $sort: {
      A: 1
    }
  },
  {
    $limit: 1000
  }
])

我需要这样做才能让它使用索引:

db.user.aggregate([
  { $match: {
      A: { $exists: true }
      B: { $gt: 100 }
  } },
  {
    $sort: {
      A: 1
    }
  },
  {
    $limit: 1000
  }
])

添加

A: { $exists: true }
是不必要的,因为所有文档都会有此字段。我以为mongodb足够聪明,可以使用索引来排序?

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

索引字段的顺序很重要。索引从左到右读取。

索引字段的顺序会影响复合索引的有效性。复合索引根据索引中字段的顺序包含对文档的引用。要创建高效的复合索引,请遵循 ESR(相等、排序、范围)规则。

取自MongoDB复合索引文档的字段顺序。

如果在第一阶段中使用,或者如果

$sort

 阶段之前仅是 
$sort
 阶段(
文档
),则 
$match 将使用索引。

按照以下顺序创建新索引应该可以解决您的问题:

{
  "B": 1,
  "A": 1
}

这当然是假设您的索引尚未正确排序。

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