MongoDBに次の種類のデータ(実際のケースから少し簡略化)があります。
{
"name":"some name",
"attrs":[
{"n":"subject","v":"Some subject"},
{"n":"description","v":"Some great description"},
{"n":"comments","v":"Comments are here!"},
]
}
attrs配列は動的属性のコンテナーです。つまり、どのような属性がそこに配置されるのかは、事前にわかりません。nは名前を表し、vは値を表します。
MongoDB In Actionブックでは、属性が完全に予測可能である場合に動的属性を持つためのソリューションとしてこれを説明しています。また、次のようにインデックスを作成できることも説明しています。
db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})
クエリは次のように実行できます。
db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})
これをテストすると、パフォーマンスが非常に低下します。200万のドキュメントがあり、インデックスがないmycollectionでテストしたところ、パフォーマンスが向上したようです。
それで、問題は、このような動的属性設定にインデックスを付けて、良いパフォーマンスが得られるようにする方法があるのでしょうか?私の場合、「件名」や「説明」などのキーを用意してすべてにインデックスを付けることはできません...