मानचित्र-कम करने वाले समाधान को चुनने के बजाय, आप परिणाम को आसानी से एकत्रित कर सकते हैं:
-
Matchरिकॉर्ड जहां दिनांक निर्दिष्ट तिथि के बराबर से अधिक है। -
Groupbrand_id. के आधार पर फ़ील्ड. -
$addToSet का उपयोग करें एक
products. को बनाए रखने के लिए ऑपरेटर अद्वितीय की सूचीproduct_idप्रत्येक समूह के लिए। -
Projectcountproducts. के प्रत्येक कुंजी में सरणी।
कोड:
db.collection.aggregate([
{$match:{"date":{$gte:new Date('2014-11-20')}}},
{$group:{"_id":"$brand_id","products":{$addToSet:"$product_id"}}},
{$project:{"_id":0,"brand_id":"$_id","distinct_prod":{$size:"$products"}}}
])
आपके मानचित्र-घटा समाधान पर आ रहा है,
यह एक तरीका है कि मोंगोडब प्रत्येक समूह के लिए कम कार्य को लागू कर सकता है। दस्तावेज़ों से :
आपको अपने map में कुछ संशोधन करने की आवश्यकता है ,reduce कार्य करता है और एक नया finalize add जोड़ें समारोह:
- आपको यह याद रखना होगा कि जब
mongodbreduce. का आह्वान करता है एक ही कुंजी के लिए एक से अधिक बार फ़ंक्शन, पिछले आमंत्रण के परिणाम को कम फ़ंक्शन के इनपुट के रूप में पास किया जाता है, साथ ही अन्य मानों के साथ अगली बार कम फ़ंक्शन लागू किया जाता है। - पहला बिंदु, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि कम करने के लिए इनपुट और कम फ़ंक्शन से वापसी मूल्य समान रूप से बनाया गया है, ताकि कम फ़ंक्शन के अंदर लिखा तर्क अपनी पिछली कॉल में अपने स्वयं के लौटाए गए मूल्य को संसाधित कर सके। ली>
- चूंकि हम बैचों में बुलाए जाने पर अलग-अलग मानों की गिनती प्राप्त करने में सक्षम नहीं होंगे, हम क्या कर सकते हैं, एक
reduceलिखें फ़ंक्शन जो विशिष्टproduct_idsको जमा करता है प्रत्येक कुंजी के लिए और एक लिखेंfinalizeफ़ंक्शन जो उन अद्वितीय मानों की गणना करता है।
कोड:
db.collection.mapReduce(
function() {
// emitting the same structure returned by the reduce function.
emit(this.brand_id, {"prod_id":[this.product_id]});
},
function(key, values) {
// the return value would be a list of unique product_ids.
var res = {"prod_id":[]};
for(var i=0;i<values.length;i++)
{
for(var j=0;j<values[i].prod_id.length;j++){
if(res.prod_id.indexOf(values[i].prod_id[j]) == -1){
res.prod_id.push(values[i].prod_id[j]);
}
}}
return res;
},
{
query: {date: {$gte: new Date('2014-11-20')}},
out: "example",
finalize: function(key, reducedValue){
// it returns just the count
return reducedValue.prod_id.length;
}
}
)