カバーリングインデックスを使用して、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で追跡できます。