「選択的な」属性を追跡する際の問題は、データの再サンプリングを常に行う必要があることです。さらに、クエリに提供される値に関係なく、選択的なすべての属性がそのプロパティを保持すると想定しています。
可能な属性のセットの例を次に示します。
{ n:"lastName", v:"Kamsky" } vs. { n:"lastName", v:"Smith" }
{ n:"firstName", v:"Asya" } vs. { n:"firstName", v:"Jessica" }
{ n:"Age", v: 21 } vs. { n:"Age", v: 15 }
最初の 2 つの比較行では、姓と名は非常に選択的 (名または姓がまれな場合) か、特に選択的でない場合 (データベースの母集団全体で共通の場合) のいずれかです。
3 行目では、データベースの内容がわからない場合、「Age」値のいずれかが選択的であるかどうかを判断できません。クエリしている大学生のコレクションの場合、2 番目の値は非常に選択的になりますが、高校生の場合、最初の値は非常に選択的なものになります。
あなたのクエリのいずれかが不等式である場合、他の要素が選択的でない限り、それらは最初の位置の要素には適していないと思います。
しかし、何が選択的で何が選択的でないかをどのように追跡できますか?
「統計」を追跡するためにできることは次のとおりです(いわば):
var X = 3; // assign a threshold equal to some number that's "too high" to scan
db.<collection>.aggregate(
{$unwind : "$records"},
{$group : {_id:{n:"$records.n",v:"$records.v"}, count:{$sum:1}}},
{$group : {_id:"$_id.n", totalDistinctValues:{$sum:1}, values:{$push:{value:"$_id.v", appears:"$count"}} } },
{$project : {_id:0, AttributeName:"$_id", totalDistinctValues:1, values:1}},
{$match : {"values.appears":{$not:{$gte: X }} }},
{$sort : {totalDistinctValues:1}},
{$limit : 10}
)
上記の集計は、最もユニークな (異なる) 値を持つ 10 個の属性を返します。さらに、各ドキュメントには、可能な値のリストとそれが表示される回数が含まれます。正確なフィールドと可能性のあるデータ分布に応じて、これを微調整する余地がたくさんあります。これをコレクションに保存してクエリを実行することはできますが、これは理にかなっていないため、アプリケーションにキャッシュするだけです。あなたが説明したユースケースに固執します。
私の小さなテストコレクションでは、返された結果は次のとおりです(「雇用主」フィールドもありましたが、レコードの半分が同じ雇用主をリストしていたため、それを排除しました):
[
{
"totalDistinctValues" : 5,
"AttributeName" : "firstName",
"values" : [
{
"value" : "Sheldon",
"appears" : 1
},
{
"value" : "Raj",
"appears" : 1
},
{
"value" : "Penny",
"appears" : 1
},
{
"value" : "Asya",
"appears" : 1
},
{
"value" : "John",
"appears" : 2
}
]
},
{
"totalDistinctValues" : 6,
"AttributeName" : "lastName",
"values" : [
{
"value" : "Kumar",
"appears" : 1
},
{
"value" : "Smith",
"appears" : 1
},
{
"value" : "Lane",
"appears" : 1
},
{
"value" : "Williams",
"appears" : 1
},
{
"value" : "Kamsky",
"appears" : 1
},
{
"value" : "Cooper",
"appears" : 1
}
]
},
{
"totalDistinctValues" : 6,
"AttributeName" : "Age",
"values" : [
{
"value" : 31,
"appears" : 1
},
{
"value" : 21,
"appears" : 1
},
{
"value" : 22,
"appears" : 1
},
{
"value" : 29,
"appears" : 1
},
{
"value" : 49,
"appears" : 1
},
{
"value" : 59,
"appears" : 1
}
]
}
]
結論: この集計を実行してデータの実際の分布を確認すると、一部の属性が自然に選択的であり、クエリに常に (または頻繁に) 存在することが明らかになる場合があります。それらを最初に置きます。それ以外の場合は、統計を使用してより選択的な属性を最初に動的に配置し、そのようなクエリのインデックス使用の改善を追跡しているhttps://jira.mongodb.org/browse/SERVER-2348に投票してください。