使用$facet查询时,MongoDB索引不起作用

使用$facet查询时,MongoDB索引不起作用,mongodb,nosql,aggregate,facet,Mongodb,Nosql,Aggregate,Facet,我在示例集合中的状态键上有索引。 这是我进行的聚合查询: db.getCollection('example').aggregate([ { $facet: { Active: [ { $match: { status: "OK" }

我在示例集合中的状态键上有索引。 这是我进行的聚合查询:

db.getCollection('example').aggregate([
    {
        $facet: {
            Active: [
                {
                    $match: {
    
                            status: "OK"
                    }
                }
            ]
       }
   }
])
此查询需要10秒以上的时间才能返回。 如果我使用find而不是aggregate执行相同的查询,查询将在0.003毫秒后返回。 正如我提到的,状态键上有索引


这里我遗漏了什么?

MongoDB聚合作为一个管道运行,从管道开始的命名集合中读取文档,按照每个阶段进行匹配和/或变异,然后传递到下一个阶段

在一个阶段中,传递到该阶段的每个文档都被转发到每个方面

对于您的管道,聚合将读取集合中的所有文档,并将它们全部传递到
活动的
方面,
$match
阶段将尽职尽责地检查每个文档


当聚合管道以过滤阶段开始时,如
$match
$geoNear
,它将使用索引从集合中选择匹配的文档,从而大大减少进入管道的文档数。

如果执行
查找
,则只会得到前几个匹配的文档(并且可以进行更多的迭代)。这将非常快。您的聚合返回一个包含所有匹配文档的数组的大型文档。这必须读取整个集合。即使添加
$skip:0
$limit:10
也需要10秒…什么是“解释”比如说?文档检查大约90k,阶段是COLLSCAN,TotalKeysChecked:0和TotalDocsChecked:90k,executionTimeMills 10s左右,是否有一些特定的东西可以查看?如果有一个通用的过滤器是由所有方面共享的,您可以将它的
$match
拖到一个早期的管道阶段。否则MongoDB将不得不你自己解决这个问题,这可能有点太过分了。