2

たとえば、find()フィールドを含む aabをこの順序で取ります。例えば、

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}})

コレクションのインデックスの配列に 2 つのキーがあります。

[
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1"
},
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1,
        "c" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1_c_1"
}
]

より正確にクエリに一致するため、mongo が最初のキーを使用することは保証されていますか、それとも 2 つのキーのいずれかがランダムに選択されるため、どちらも機能しますか?

4

2 に答える 2

5

MongoDB には、最も効率的なインデックスを選択するクエリ オプティマイザがあります。ドキュメントから:

MongoDB クエリ オプティマイザーは、クエリを処理し、使用可能なインデックスが与えられたクエリに対して最も効率的なクエリ プランを選択します。

したがって、厳密に保証されているわけではありません (ただし、インデックスが小さいほど、複合インデックスが大きい場合よりも速く結果が得られると思います)。ヒント演算子を使用して、クエリ オプティマイザーに指定したインデックスを強制的に使用させることもできます。

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}}).hint({a:1, b:1});

ただし、この例の 2 つのインデックスは冗長です。これは、複合インデックスがインデックスフィールドの任意のプレフィックスに対するクエリをサポートしているためです。

次のインデックス:

db.collection.ensureIndex({a: 1, b: 1, c: 1});

aaおよびbおよびaを含むクエリをサポートできます。b_ c_bcbc

于 2014-07-13T08:53:04.923 に答える
0

You and use $exist,, が true の場合、$exists は、フィールド値が null のドキュメントを含む、フィールドを含むドキュメントと一致します。が false の場合、クエリはフィールドを含まないドキュメントのみを返します。

$存在する

クエリは次のようになります

db.inventory.find( { "key.a": { $exists: true, 1 },"key.b": { $exists: true, 1 }  } )
于 2014-07-13T07:30:21.017 に答える