MongoDB には、インデックスを作成したいサブドキュメントを含む配列を持つドキュメントのコレクションがあります。
{
_id : ObjectId(),
members : [
{ ref : ObjectId().str, ... },
{ ref : ObjectId().str, ... },
...
]
}
インデックスは ref フィールドにあるため、メンバーに特定の「ref」を持つすべてのドキュメントをすばやく見つけることができます。
db.test.ensureIndex({ "members.ref" : 1 });
配列の長さが数千を超えると、追加のサブドキュメントを配列にプッシュするパフォーマンスが急速に低下することに気付きました。代わりに文字列の配列にインデックスを使用しても、パフォーマンスは低下しません。
次のコードは、動作を示しています。
var _id = ObjectId("522082310521b655d65eda0f");
function initialize () {
db.test.drop();
db.test.insert({ _id : _id, members : [], memberRefs : [] });
}
function pushToArrays (n) {
var total, err, ref;
total = Date.now();
for (var i = 0; i < n; i++) {
ref = ObjectId().str;
db.test.update({ _id : _id }, { $push : { members : { ref : ref }, memberRefs : ref } });
err = db.getLastError();
if (err) {
throw err;
}
if ((i + 1) % 1000 === 0) {
print("pushed " + (i + 1));
}
}
total = Date.now() - total;
print("pushed " + n + " in " + total + "ms");
}
initialize();
pushToArrays(5000);
db.test.ensureIndex({ "members.ref" : 1 });
pushToArrays(10);
db.test.dropIndexes();
db.test.ensureIndex({ "memberRefs" : 1 });
pushToArrays(10);
db.test.dropIndexes();
たとえば、私のマシンで MongoDB 2.4.6 を使用すると、長さ 5000 の配列に 10 個の要素をプッシュするのに次の時間が使用されることがわかります。
- 「members.ref」のインデックス: 37272ms
- 「memberRefs」のインデックス: 405ms
その違いは予想外のようです。これは MongoDB の問題ですか、それともマルチキー インデックスの使用に問題がありますか? これを処理するための推奨される方法はありますか? ありがとう。