यह कुछ ऐसा है जो केवल एकत्रीकरण ढांचे के साथ नहीं किया जा सकता है, और इस प्रकार के संचालन के लिए उपलब्ध एकमात्र वर्तमान MongoDB विधि mapReduce है।
इसका कारण यह है कि एक एकत्रीकरण ढांचे में मौजूदा दस्तावेज़ के अलावा किसी अन्य दस्तावेज़ को संदर्भित करने का कोई तरीका नहीं है। यह वास्तव में "ग्रुपिंग" पाइपलाइन चरणों पर भी लागू होता है, क्योंकि भले ही चीजों को "कुंजी" पर समूहीकृत किया गया हो, आप वास्तव में अलग-अलग दस्तावेज़ों से उस तरह से निपट नहीं सकते हैं जैसा आप चाहते हैं।
दूसरी ओर MapReduce में एक सुविधा उपलब्ध है जो आपको वह करने की अनुमति देती है जो आप यहां चाहते हैं, और यह एकत्रीकरण से संबंधित "सीधे" भी नहीं है। यह वास्तव में सभी चरणों में "वैश्विक स्तर पर चर" रखने की क्षमता है। और मूल रूप से "अंतिम दस्तावेज़ को संग्रहीत करने" के लिए एक "चर" होने से आपको अपना परिणाम प्राप्त करने की आवश्यकता होती है।
तो यह काफी सरल कोड है, और वास्तव में कोई "कमी" आवश्यक नहीं है:
db.collection.mapReduce(
function () {
if (lastVal != null)
emit( this._id, this.val - lastVal );
lastVal = this.val;
},
function() {}, // mapper is not called
{
"scope": { "lastVal": null },
"out": { "inline": 1 }
}
)
जो आपको बहुत कुछ इस तरह का परिणाम देता है:
{
"results" : [
{
"_id" : ObjectId("54a425a99b8bcd6f73e2d662"),
"value" : 2
},
{
"_id" : ObjectId("54a425a99b8bcd6f73e2d663"),
"value" : 3
},
{
"_id" : ObjectId("54a425a99b8bcd6f73e2d664"),
"value" : 4
}
],
"timeMillis" : 3,
"counts" : {
"input" : 4,
"emit" : 3,
"reduce" : 0,
"output" : 3
},
"ok" : 1
}
यह वास्तव में उत्सर्जित _id
. के रूप में "कुछ अद्वितीय" चुन रहा है किसी विशिष्ट चीज़ के बजाय मूल्य, क्योंकि यह सब वास्तव में अलग-अलग दस्तावेज़ों के मूल्यों के बीच का अंतर है।
वैश्विक चर आमतौर पर इस प्रकार के "युग्मन" एकत्रीकरण या "चल रहे योग" का समाधान होते हैं। अभी एकत्रीकरण ढांचे की वैश्विक चरों तक कोई पहुंच नहीं है, भले ही यह अच्छा हो। mapReduce ढांचा उनके पास है, इसलिए शायद यह कहना उचित होगा कि उन्हें एकत्रीकरण ढांचे के लिए भी उपलब्ध होना चाहिए।
हालांकि अभी वे नहीं हैं, इसलिए mapReduce से चिपके रहें।