使用$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将不得不你自己解决这个问题,这可能有点太过分了。