1) Cara termudah untuk melakukannya adalah melalui kerangka kerja agregasi. Ini membutuhkan dua perintah "$group":yang pertama mengelompokkan berdasarkan nilai yang berbeda, yang kedua menghitung semua nilai yang berbeda
pipeline = [
{ $group: { _id: "$myIndexedNonUniqueField"} },
{ $group: { _id: 1, count: { $sum: 1 } } }
];
//
// Run the aggregation command
//
R = db.runCommand(
{
"aggregate": "myCollection" ,
"pipeline": pipeline
}
);
printjson(R);
2) Jika Anda ingin melakukan ini dengan Map/Reduce, Anda bisa. Ini juga merupakan proses dua fase:di fase pertama kami membangun koleksi baru dengan daftar setiap nilai yang berbeda untuk kunci tersebut. Di detik kami melakukan count() pada koleksi baru.
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() );
Perhatikan bahwa Anda tidak dapat mengembalikan hasil peta/pengurangan sebaris, karena hal itu berpotensi melampaui batas ukuran dokumen 16 MB. Anda bisa simpan perhitungan dalam koleksi dan kemudian hitung() ukuran koleksi, atau Anda bisa mendapatkan jumlah hasil dari nilai kembalian mapReduce().