1)これを行う最も簡単な方法は、集約フレームワークを使用することです。これには2つの「$group」コマンドが必要です。最初のコマンドは個別の値でグループ化し、2番目のコマンドはすべての個別の値をカウントします
pipeline = [
{ $group: { _id: "$myIndexedNonUniqueField"} },
{ $group: { _id: 1, count: { $sum: 1 } } }
];
//
// Run the aggregation command
//
R = db.runCommand(
{
"aggregate": "myCollection" ,
"pipeline": pipeline
}
);
printjson(R);
2)Map / Reduceを使用してこれを実行する場合は、可能です。これも2フェーズのプロセスです。最初のフェーズでは、キーのすべての個別の値のリストを使用して新しいコレクションを作成します。 2番目では、新しいコレクションに対してcount()を実行します。
var SOURCE = db.myCollection;
var DEST = db.distinct
DEST.drop();
map = function() {
emit( this.myIndexedNonUniqueField , {count: 1});
}
reduce = function(key, values) {
var count = 0;
values.forEach(function(v) {
count += v['count']; // count each distinct value for lagniappe
});
return {count: count};
};
//
// run map/reduce
//
res = SOURCE.mapReduce( map, reduce,
{ out: 'distinct',
verbose: true
}
);
print( "distinct count= " + res.counts.output );
print( "distinct count=", DEST.count() );
map / reduceインラインの結果を返すことはできないことに注意してください。これは、16MBのドキュメントサイズ制限を超える可能性があるためです。 できます 計算をコレクションに保存してから、コレクションのサイズをcount()するか、mapReduce()の戻り値から結果の数を取得できます。