आप विशिष्ट का उपयोग करके दस्तावेज़ (या सबसेट) को आसानी से वापस नहीं कर सकते हैं। दस्तावेज़ीकरण के अनुसार यह केवल दी गई कुंजी के आधार पर मानों की विशिष्ट सरणी देता है। लेकिन आप इसे मैप-रिड्यूस का उपयोग करके प्राप्त कर सकते हैं
var _map = function () {
emit(this.hash.call_id, {doc:this});
}
var _reduce = function (key, values) {
var ret = {doc:[]};
var doc = {};
values.forEach(function (value) {
if (!doc[value.doc.hash.call_id]) {
ret.doc.push(value.doc);
doc[value.doc.hash.call_id] = true; //make the doc seen, so it will be picked only once
}
});
return ret;
}
उपरोक्त कोड स्वयं व्याख्यात्मक है, मानचित्र फ़ंक्शन पर मैं इसे कुंजी hash.call_id
द्वारा समूहीकृत कर रहा हूं और पूरे दस्तावेज़ को वापस कर रहा है ताकि इसे फ़ंक्शन को कम करके संसाधित किया जा सके।
फ़ंक्शन को कम करने पर, समूहीकृत परिणाम सेट के माध्यम से बस लूप करें और समूहीकृत सेट से केवल एक आइटम चुनें (एकाधिक डुप्लिकेट कुंजी मानों के बीच - विशिष्ट सिमुलेशन)।
अंत में कुछ परीक्षण डेटा बनाएं
> db.disTest.insert({hash:{call_id:"1234"},something:"AAA"})
> db.disTest.insert({hash:{call_id:"1234"},something:"BBB"})
> db.disTest.insert({hash:{call_id:"1234"},something:"CCC"})
> db.disTest.insert({hash:{call_id:"5555"},something:"DDD"})
> db.disTest.insert({hash:{call_id:"5555"},something:"EEE"})
> db.disTest.find()
{ "_id" : ObjectId("4f30a27c4d203c27d8f4c584"), "hash" : { "call_id" : "1234" }, "something" : "AAA" }
{ "_id" : ObjectId("4f30a2844d203c27d8f4c585"), "hash" : { "call_id" : "1234" }, "something" : "BBB" }
{ "_id" : ObjectId("4f30a2894d203c27d8f4c586"), "hash" : { "call_id" : "1234" }, "something" : "CCC" }
{ "_id" : ObjectId("4f30a2944d203c27d8f4c587"), "hash" : { "call_id" : "5555" }, "something" : "DDD" }
{ "_id" : ObjectId("4f30a2994d203c27d8f4c588"), "hash" : { "call_id" : "5555" }, "something" : "EEE" }
और इस मानचित्र को चलाने से कम करें
> db.disTest.mapReduce(_map,_reduce, {out: { inline : 1}})
{
"results" : [
{
"_id" : "1234",
"value" : {
"doc" : [
{
"_id" : ObjectId("4f30a27c4d203c27d8f4c584"),
"hash" : {
"call_id" : "1234"
},
"something" : "AAA"
}
]
}
},
{
"_id" : "5555",
"value" : {
"doc" : [
{
"_id" : ObjectId("4f30a2944d203c27d8f4c587"),
"hash" : {
"call_id" : "5555"
},
"something" : "DDD"
}
]
}
}
],
"timeMillis" : 2,
"counts" : {
"input" : 5,
"emit" : 5,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}
आपको विशिष्ट सेट का पहला दस्तावेज़ मिलता है। आप पहले नक्शे को स्ट्रिंग करके/फ़ंक्शंस को कम करके मोंगोइड में ऐसा ही कर सकते हैं और इस तरह मेप्रिडस को कॉल कर सकते हैं
MyObject.collection.mapreduce(_map,_reduce,{:out => {:inline => 1},:raw=>true })
आशा है कि यह मदद करता है