У меня есть данные в коллекции 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 мс. Можно ли индексировать этот тип запроса, и если да, то есть ли какие-либо идеи относительно того, как я могу улучшить производительность?