मानचित्र-कम करने वाले समाधान को चुनने के बजाय, आप परिणाम को आसानी से एकत्रित कर सकते हैं:
-
Match
रिकॉर्ड जहां दिनांक निर्दिष्ट तिथि के बराबर से अधिक है। -
Group
brand_id
. के आधार पर फ़ील्ड. -
$addToSet का उपयोग करें एक
products
. को बनाए रखने के लिए ऑपरेटर अद्वितीय की सूचीproduct_id
प्रत्येक समूह के लिए। -
Project
count
products
. के प्रत्येक कुंजी में सरणी।
कोड:
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 जोड़ें समारोह:
- आपको यह याद रखना होगा कि जब
mongodb
reduce
. का आह्वान करता है एक ही कुंजी के लिए एक से अधिक बार फ़ंक्शन, पिछले आमंत्रण के परिणाम को कम फ़ंक्शन के इनपुट के रूप में पास किया जाता है, साथ ही अन्य मानों के साथ अगली बार कम फ़ंक्शन लागू किया जाता है। - पहला बिंदु, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि कम करने के लिए इनपुट और कम फ़ंक्शन से वापसी मूल्य समान रूप से बनाया गया है, ताकि कम फ़ंक्शन के अंदर लिखा तर्क अपनी पिछली कॉल में अपने स्वयं के लौटाए गए मूल्य को संसाधित कर सके। ली>
- चूंकि हम बैचों में बुलाए जाने पर अलग-अलग मानों की गिनती प्राप्त करने में सक्षम नहीं होंगे, हम क्या कर सकते हैं, एक
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;
}
}
)