次の形式の 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 ミリ秒を超えるまで低下します。このタイプのクエリはインデックス可能ですか? もしそうなら、パフォーマンスを向上させる方法についてのアイデアはありますか?