コレクション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
ではインデックスを使用できないため、インデックスを強制的に使用できますか?
注:
- コレクション
B
コレクションA
その後、多くの大きい、distinct
を使用することができ、インデックスのサイズに制限はありますか? - 私は読んでいます:Count distinct values in mongoDBとMongoDB - distinct with query doesn't use indexes私は見ている振る舞いの違いを説明しません。
- 両方のコレクションは、
sharded
- 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
文書は非常に明確ですhttps://docs.mongodb.com/manual/reference/method/db.collection.distinct/#index-use: "可能であれば、インデックスを使用できます。" 'db.B.explain(" allPlansExecution ")。distinct(" obj.field2 ")'を試して、なぜそれが不可能であるかを見てください。 'フィルター'部分は疑わしいと思われます。そこにクエリパラメータがありますか? –
@AlexBlex私は、「可能なときは」それが得られるほど曖昧であると主張するでしょう。また、「allPlansExecution」モードを試みると、説明は決して返されません(それは非常に大きなコレクションです)。私が言及していないもう一つの事は、この両方のコレクションが** shardedされていることです**、私は質問のノートにそれを追加します – marmor