我有成千上万份这样的文件:
{
"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正在使用另一个索引,即
{"field_id":1, "anotherField":1}执行状态显示了这一阶段:
当然,如果mongo使用了正确的索引,我希望它已经从IXSCAN检索了20k文档,或者至少更接近这个值。
我只是不明白芒果为什么不使用那个指数。我还试图更改索引中字段的顺序,但没有成功。我用的是Mongo 4.4.6
发布于 2021-12-23 15:54:57
解决了
所以这其实很容易解决。MongoDB Compass不允许我在数组的某个位置(在本例中是parentList.0.list)上创建索引,因为当我尝试插入它时,它会自动替换为parentList.list。最后,我发现,如果在shell中执行,对数组的某个位置进行索引实际上是可行的。因此,我在parentList.0.list上创建了索引,索引运行良好。就这样。希望这对其他人也有帮助。
发布于 2021-12-20 18:31:50
发布于 2021-12-21 02:25:55
这个索引
{"field_id":1, "anotherField":1}对数据库的大多数查询工作吗?
根据我的经验,MongoDB通常会选择一个非常通用的索引,即使有时更具体的索引更好。我修正了这一点,使索引更加特定于它们的使用(并移除"catch-all“索引)。我不知道这是否适用于您的用例,因为对所选索引的推理是未知的。
https://stackoverflow.com/questions/70426006
复制相似问题