2017-03-29 3 views
0

コレクションAに "field1"以上のユニークでないインデックスがあります。mongodb distinctはインデックスを使用することがあり、時には使用しません。

私が実行している場合:

db.A.explain().distinct("field1") 

私が取得:

"winningPlan" : { 
    "stage" : "PROJECTION", 
    ... 
    "inputStage" : { 
     "stage" : "DISTINCT_SCAN", 
     "keyPattern" : { 
      "field1" : 1.0 
     }, 
    ... 
} 

それが明確なコールのインデックスを使用します示唆しています。 "type2.key" 上の非ユニークインデックスを持つコレクションBでしかし

、私は実行する場合:

db.B.explain().distinct("type2.key") 

私が手:

それは使用していない意味のようです
"winningPlan" : { 
    "stage" : "COLLSCAN", 
    "filter" : { 
     "$and" : [] 
    }, 
    ... 
} 

インデックス。

なぜdistinctはコレクションAではインデックスを使用しますが、コレクションBではインデックスを使用できないため、インデックスを強制的に使用できますか?

注:

  1. コレクションBコレクションAその後、多くの大きい、distinctを使用することができ、インデックスのサイズに制限はありますか?
  2. 私は読んでいます:Count distinct values in mongoDBMongoDB - distinct with query doesn't use indexes私は見ている振る舞いの違いを説明しません。
  3. 両方のコレクションは、sharded
  4. MongoDBのバージョンである異なる指標を用いることができる場合

    { 
        "_id" : ObjectId("57d6c1cf691fa014e0615aa7"), 
        "type1" : [ 
         { 
          "key" : "key1", 
          "field" : "value1", 
         }, 
         { 
          "key" : "key2", 
          "field" : "value2", 
         } 
        ], 
        "type2" : [ 
         { 
          "key" : "key3", 
          "field" : "value3", 
         }, 
         { 
          "key" : "key4", 
          "field" : "value4", 
         } 
        ] 
    } 
    

    3.2.12

例文書がインデックスは、type2.key

+0

文書は非常に明確ですhttps://docs.mongodb.com/manual/reference/method/db.collection.distinct/#index-use: "可能であれば、インデックスを使用できます。" 'db.B.explain(" allPlansExecution ")。distinct(" obj.field2 ")'を試して、なぜそれが不可能であるかを見てください。 'フィルター'部分は疑わしいと思われます。そこにクエリパラメータがありますか? –

+0

@AlexBlex私は、「可能なときは」それが得られるほど曖昧であると主張するでしょう。また、「allPlansExecution」モードを試みると、説明は決して返されません(それは非常に大きなコレクションです)。私が言及していないもう一つの事は、この両方のコレクションが** shardedされていることです**、私は質問のノートにそれを追加します – marmor

答えて

1

ルールになっていますあります。https://github.com/mongodb/mongo/blob/v3.4/src/mongo/db/query/get_executor.cpp#L1104

この特定のケース https://github.com/mongodb/mongo/blob/v3.4/src/mongo/db/query/get_executor.cpp#L1139ため

最も影響力のあるラインは言う:私たちは、点線フィールド上に突出している場合

は、マルチキーインデックスをスキップします。

"obj.field2"はドットフィールドなので、インデックスは適用されません。

基本的にdistinct()では、インデックスはルートフィールドにのみ使用でき、配列やサブ文書には使用できません。

+0

ありがとう!それは非常に良いリードです...しかし、マルチキーインデックスは配列上のインデックスではありませんか?その場合、私のインデックスは 'マルチキー'ではありません。 – marmor

+0

十分に公正。それは質問に追加する価値があるだろう。さらに混乱を避けるために両方のコレクションのドキュメントの例でもあります。 –

+0

mongodbのバージョンは3.2.12で、質問に追加されています。それについて考えると、インデックスのドットの前のフィールドである 'obj'は内部文書の配列であり、インデックスは'マルチキー 'になりますか?質問に例文を追加します。 – marmor

関連する問題