2016-04-29 14 views
1
私はこのような文書のコレクションでのMongoDBと流星を使用してい

の構文に基づいて使用されていない: collection._ensureIndex({'c.d': 1});MongoDBのインデックスがクエリ

{a: 'a1', 
b: 'b1', 
c: { 
    d: 'd1', 
    e: 'e1' 
    } 
} 

私は当初、このようなインデックスを作成しました

そして、 collection.find({c: {d: 'd1'})のようにクエリを実行しました。これらは非常に遅く実行され、私がexplain()でデバッグしたとき、私は彼らがインデックスを使用していないことを認識しました。私はこのようなクエリを実行した場合

OTOHは、: collection.find({'c.d': 'd1'})、その後、モンゴインデックスを使用します。

サブ文書全体をインデックス化するようにインデックスを変更しました。つまり、collection._ensureIndex({c: 1})です。最初のクエリがインデックスにヒットしました。

私の質問は、これはバグですか、機能ですか?私の印象は、JSONでは2つの表記が同等であり、非常に率直に言えば、2つのクエリ用語が同じフィールドを参照しており、適切なインデックスを使用していることを知るのに十分なデータベースがあると思います。

サブ文書全体のインデックスを作成する際の回避策は、最終的に索引を必要としないフィールドを多く含む可能性があり、必要のない時間とRAMを浪費するために最適ではないようです。

これはバグではない場合、Mongoにネストされたオブジェクトの構文を認識させ、インデックスを適切に使用させる方法がありますか?

答えて

0

モンゴーの文書を確認した後、わかりました。基本的には、です。これらの2つのセマンティクスの違いがあります。基本的には、クエリ{c: {d: d1}}の最初の形式では、サブ文書全体を指定していることをmongoが前提としています。したがって、サブ文書{c: {d: d1, e: e1}}がある場合、それは一致しません。

OTOHの2番目の形式のクエリ{'c.d': d1}は、サブ文書内の1つのフィールドに一致するものだけを指定していることを示しています。これは、サブ文書に他のフィールドまたはサブサブ文書全体があっても一致します。

この違いはインデックスにも及んでいます。 _ensureIndex({c: 1})_ensureIndex({'c.d': 1})は2つの異なるインデックスであり、最初のインデックスはサブドキュメント全体をインデックス化しますが、c.dという表記法を使用して個々のフィールドでクエリを実行した場合は使用されません。

関連する問題