我在 mongodb 集合中有以下格式的数据:
{
_id: ObjectId,
Product: string,
Modules: [
{
StaticModuleId: Int64,
Set: [
{
k: Int64,
v: {
Value: Double,
AnotherId: Int64
}
},
...
]
},
...
]
}
这是我的名为 MyIndex 的索引:
{
Product: 1,
'Modules.StaticModuleId': 1,
'Modules.Set.k': 1,
'Modules.Set.v.Value': 1
}
集合中有 5 个文档,每个文档有 10 个模块,每个集合中有 100 个元素,集合中总共有 50 个模块和 5000 个条目。然后我运行了这个查询:
{
'Product': 'Test',
$and: [
{
'Modules.StaticModuleId': 2010220,
'Modules.Set': {
$elemMatch: {
k: 41439,
'v.Value': 2186233
}
}
},
{
'Modules.StaticModuleId': 2010226
},
{
'Modules.StaticModuleId': 2010228
}
]
}
这是.explain():
{
cursor: 'BtreeCursor MyIndex',
isMultiKey: true,
n: 4,
nscannedObjects: 941,
nscanned: 941,
nscannedObjectsAllPlans: 941,
nscannedAllPlans: 941,
scanAndOrder: false,
indexOnly: false,
nYields: 0,
nChunkSkips: 0,
millis: 52
}
随着我继续添加额外的 $elemMatch 子句,性能下降到 > 200 毫秒。这种类型的查询是否可索引,如果可以,关于如何提高性能的任何想法?