5

カバーリングインデックスを使用して、mongodbを使用するアプリにステミングテキスト検索を実装しようとしています。

次のインデックスセットがあります。

ensureIndex({st: 1, n: 1, _id: 1});

しかし、クエリでexplain()を実行すると、何をしても、indexOnlyがtrueを読み取ることはできません。

db.merchants.find({st: "Blue"}, {n:1,_id:1}).explain()
{
    "cursor" : "BtreeCursor st_1_n_1__id_1",
    "nscanned" : 8,
    "nscannedObjects" : 8,
    "n" : 8,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : {
        "st" : [
            [
                "Blue",
                "Blue"
            ]
        ],
        "n" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "_id" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }
}

インデックス内のキーの順序がどういうわけか重要であることはすでに理解しています。たとえば、{_ id、n:1、st:1}を使用した場合、クエリを実行するためにこのインデックスをまったく使用していませんでした。また、複数の戦略が同等に高速であるため、ドキュメントが少なすぎると、explain()で予測できない動作が発生する可能性があることもどこかで読みました。しかし、この場合、正しいインデックスを使用していることがわかりますが、インデックスだけを使用しているわけではありません。これは何が起こっているのですか?

私はmongoidを使用しており、mongo2.0.8を使用していると思います。

アップデート:

Mongoidv3.1.4とmongodv2.2の使用に切り替えました

これがmongodがmongoidから見ているクエリです:Mon Jul 15 10:47:26 [conn14] runQuery called spl_development.merchants {$ query:{st:{$ regex: "cr"、$ options: "i"}} 、$ Explain:true} Mon Jul 15 10:47:26 [conn14] query spl_development.merchants query:{$ query:{st:{$ regex: "cr"、$ options: "i"}}、$ Explain: true} ntoreturn:0 keyUpdates:0 locks(micros)r:212 nreturned:1 reslen:393 0ms

したがって、プロジェクションはmongodレイヤーに送信されず、アプリケーションレイヤーでのみ処理されます。理想的ではありません!

これはmongoidのバグとして認識されており、 https ://github.com/mongoid/mongoid/issues/3142で追跡できます。

4

2 に答える 2

8

インデックスに配列が含まれているフィールドがあるため、クエリでカバーされたインデックスを使用できないと思います。これは、の説明で提案されてい"isMultiKey" : trueます。

ドキュメント(対象クエリをサポートするインデックスの作成)に記載されているように:

コレクション内のドキュメントのいずれかのインデックス付きフィールドに配列が含まれている場合、MongoDBは対象クエリを使用できません。インデックス付きフィールドが配列の場合、インデックスはマルチキーインデックスになり、対象クエリをサポートできません。

于 2013-01-07T06:39:21.477 に答える
1

2.2.2で問題を再現できませんでしたが.sort({n: 1, _id: 1})、チェーンに追加しました。並べ替えを行っていないため、mongoが使用したい順序でドキュメントを要求します。それがインデックスの順序(たとえば、順序)とfind一致しない場合でも、ドキュメントを読み取る必要があります。$natural

db.merchants.find({st: "Blue"}, {n:1,_id:1}).sort({n: 1, _id: 1}).explain()
于 2013-01-07T06:32:16.697 に答える