我有成千上万的文件是这样的:
{
"field_id" : "abcd",
"aField" : 0,
"parentList": [
{
"field": "value1",
"list": ["element1,element2"]
}
,
{
"field": "value2",
"list": ["element1, element3"]
}
]
}
(这是我的数据库中更大文档的过度简化版本,包含更多字段。数据库包含数百万个文档)。这是我想用于计数执行的过滤器:
{ 'parentList.0.list':
{ '$in':
[ 'element1',
'element2',
'element3',
'element4'
]
},
aField: { '$ne': 1 },
field_id: { '$in': [ 'abcd' ] }
}
我想要做的是创建一个这样的索引:
{"field_id" : 1, "parentList.list" :1, "aField" : 1}
并让查询使用它。但mongo实际上忽略了它。相反,mongo 正在使用另一个索引,即
{"field_id":1, "anotherField":1}
执行统计数据显示了这个阶段:
- IXSCAN 对 {"field_id":1, "anotherField":1} 索引,产生 500k 个keysExamined,这是 500k 个具有 field_id = 'abcd' 的文档
- 获取过滤器的其余部分,返回 20k 作为计数
当然,如果 mongo 使用了正确的索引,我希望它已经从 IXSCAN 检索到 20k 文档,或者至少是更接近的数字。
我只是不明白为什么 mongo 不使用该索引。我还尝试更改索引中字段的顺序,但没有成功。我正在使用 Mongo 4.4.6