1) ऐसा करने का सबसे आसान तरीका एकत्रीकरण ढांचे के माध्यम से है। इसमें दो "$group" कमांड लगते हैं:पहला समूह अलग-अलग मानों के आधार पर, दूसरा एक सभी अलग-अलग मानों को गिनता है
pipeline = [
{ $group: { _id: "$myIndexedNonUniqueField"} },
{ $group: { _id: 1, count: { $sum: 1 } } }
];
//
// Run the aggregation command
//
R = db.runCommand(
{
"aggregate": "myCollection" ,
"pipeline": pipeline
}
);
printjson(R);
2) यदि आप इसे मानचित्र/घटाना के साथ करना चाहते हैं तो आप कर सकते हैं। यह भी दो चरणों वाली प्रक्रिया है:पहले चरण में हम कुंजी के लिए प्रत्येक विशिष्ट मान की सूची के साथ एक नया संग्रह बनाते हैं। दूसरे में हम नए संग्रह पर एक गिनती () करते हैं।
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() );
ध्यान दें कि आप मानचित्र के परिणाम को वापस नहीं कर सकते/इनलाइन को कम कर सकते हैं, क्योंकि यह संभावित रूप से 16 एमबी दस्तावेज़ आकार सीमा को पार कर जाएगा। आप कर सकते हैं गणना को एक संग्रह में सहेजें और फिर संग्रह के आकार की गणना करें (), या आप mapReduce () के वापसी मूल्य से परिणामों की संख्या प्राप्त कर सकते हैं।