MongoDBで動的属性にインデックスを付ける方法


8

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でテストしたところ、パフォーマンスが向上したようです。

それで、問題は、このような動的属性設定にインデックスを付けて、良いパフォーマンスが得られるようにする方法があるのでしょうか?私の場合、「件名」や「説明」などのキーを用意してすべてにインデックスを付けることはできません...

回答:


5

私はまた、mongodb-userメーリングリストで同じ質問を(少し拡張した形で)行い、そこで回答を得ました。そこから読んで詳細を確認してください。簡単に言えば、質問で使用されている戦略はうまく機能するはずですが、非常に非効率になる問題があります。うまくいけば、問題はすぐに修正されます。

私の場合、タプル{n、v}の完全一致をクエリするだけでよいので、マルチキーインデックスを作成できます。

db.mycollection.ensureIndex({"attrs":1})

次のようにクエリを実行します。

db.mycollection.find({"attrs": {n: "subject", v: "Some subject"}})

これはうまく機能し、インデックスを非常に効果的に使用します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.