0

ここでカバーされたクエリの mongo ドキュメントでは、クエリとプロジェクションについて説明されており、カバーされたクエリが必要な場合は、プロジェクションの _id フィールドをオフにするだけです。_id フィールドが必要であり、カバーされたクエリ (indexOnly = True) の効率が必要な場合はどうすればよいでしょうか?

 db.collection.ensureIndex({field1:1,_id:1})
 db.collection.getIndexKeys()

 [{
    "_id" : 1
},
{
    "field1" : 1
},
{
    "field1" : 1,
    "_id" : 1
}]

db.collection.find({field1:{$regex:/^\s/}},{field1:1,_id:1}).explain()
{
"cursor" : "BtreeCursor fieldname",
"isMultiKey" : false,
"n" : 3582,
"nscannedObjects" : 3582,
"nscanned" : 130511408,
"nscannedObjectsAllPlans" : 3582,
"nscannedAllPlans" : 130511408,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 20,
"nChunkSkips" : 0,
"millis" : 158705,
"indexBounds" : {
    "cdr3_aa" : [
        [
            "",
            {

            }
        ]
    ]
},
"server" : localhost}

もちろん、プロジェクションで _id をオフにすると、IndexOnly は true を返し、クエリは超高速になります。私は何を間違っていますか?

編集 - スペースの大文字と小文字を区別しないようにし、^ を追加してクエリを高速化することで効率を高めましたが、IndexOnly : False です。なぜそれが真実ではないのか理解できません。

4

2 に答える 2

0

理由はよくわかりませんが、クエリが{ field1: 1 }インデックスではなくインデックスを使用しているよう{ field1: 1, _id: 1 }です。ヒントを使用してクエリを実行してみてください。

db.collection.find( { field1: {$regex:/^\s/} }, { field1: 1, _id: 1 } ).hint( { field1: 1, _id: 1 } ).explain()

クエリ オプティマイザーが最初に { field1: 1 } インデックスを選択し、さまざまなプランを再評価していない可能性があります。クエリ オプティマイザーの説明とプランの選択方法については、http://docs.mongodb.org/manual/core/query-plans/を参照してください。

于 2013-09-12T03:35:21.183 に答える