आप यह नक्शा कर सकते हैंसंचालन कम करें।
पहले मैपर:
var mapper = function () {
if ( this.flag == true ) {
totalCount++;
} else {
totalCount = 0;
}
if ( totalCount != 0 ) {
emit (
counter,
{ _id: this._id, totalCount: totalCount }
);
} else {
counter++;
}
};
जो true
. के कुल समय की एक चालू गिनती रखता है ध्वज में मूल्य देखा जाता है। यदि वह संख्या 1 से अधिक है तो हम मान का उत्सर्जन करते हैं, जिसमें दस्तावेज़ भी शामिल है _id
. एक अन्य काउंटर जो कुंजी के लिए उपयोग किया जाता है, जब ध्वज false
होता है, तो वृद्धि की जाती है , मैचों के लिए समूह "कुंजी" रखने के लिए।
फिर रिड्यूसर:
var reducer = function ( key, values ) {
var result = { docs: [] };
values.forEach(function(value) {
result.docs.push(value._id);
result.totalCount = value.totalCount;
});
return result;
};
बस _id
को पुश करता है कुल गणना के साथ परिणाम सरणी पर मान।
फिर दौड़ें:
db.people.mapReduce(
mapper,
reducer,
{
"out": { "inline": 1 },
"scope": {
"totalCount": 0,
"counter": 0
},
"sort": { "updated_at": 1 }
}
)
तो mapper
. के साथ और reducer
फ़ंक्शन, फिर हम "स्कोप" में उपयोग किए जाने वाले वैश्विक चर को परिभाषित करते हैं और "सॉर्ट" में पास करते हैं जो कि updated_at
पर आवश्यक था। पिंड खजूर। जो परिणाम देता है:
{
"results" : [
{
"_id" : 1,
"value" : {
"docs" : [
3,
4
],
"totalCount" : 2
}
},
{
"_id" : 2,
"value" : {
"docs" : [
7,
8,
5
],
"totalCount" : 3
}
}
],
"timeMillis" : 2,
"counts" : {
"input" : 7,
"emit" : 5,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}
बेशक आप totalCount
. को छोड़ सकते हैं परिवर्तनीय और केवल सरणी लंबाई का उपयोग करें, जो वही होगा। लेकिन चूंकि आप वैसे भी उस काउंटर का उपयोग करना चाहते हैं, इसे अभी जोड़ा गया है। लेकिन यह सिद्धांत है।
तो हाँ, यह mapReduce के अनुकूल एक समस्या थी, और अब आपके पास एक उदाहरण है।