आप अभी तक एकत्रीकरण ढांचे का उपयोग करके ऐसा नहीं कर सकते हैं - आप प्रत्येक समूह के लिए $ अधिकतम या शीर्ष दिनांक मान प्राप्त कर सकते हैं लेकिन एकत्रीकरण ढांचे में अभी तक शीर्ष एन जमा करने का कोई तरीका नहीं है और पूरे दस्तावेज़ को परिणाम सेट में धक्का देने का कोई तरीका नहीं है (केवल अलग-अलग फ़ील्ड)।
तो आपको MapReduce पर वापस आना होगा। यहां कुछ ऐसा है जो काम करेगा, लेकिन मुझे यकीन है कि कई प्रकार हैं (सभी को किसी विशिष्ट विशेषता के आधार पर वस्तुओं की एक सरणी को सॉर्ट करने की आवश्यकता होती है, मैंने अपना समाधान इस प्रश्न के उत्तर ।
मानचित्र फ़ंक्शन - समूह नाम को एक कुंजी के रूप में और पूरे शेष दस्तावेज़ को मान के रूप में आउटपुट करता है - लेकिन यह इसे एक सरणी वाले दस्तावेज़ के रूप में आउटपुट करता है क्योंकि हम प्रति समूह परिणामों की एक सरणी जमा करने का प्रयास करेंगे:
map = function () {
emit(this.name, {a:[this]});
}
कम करें फ़ंक्शन एक ही समूह से संबंधित सभी दस्तावेज़ों को एक सरणी (कॉनसैट के माध्यम से) में जमा करेगा। ध्यान दें कि यदि आप दिनांक की जांच करके केवल शीर्ष पांच सरणी तत्वों को रखने के लिए कम करें को अनुकूलित करते हैं तो आपको अंतिम रूप देने की आवश्यकता नहीं होगी, और आप मैप्रिडस चलाने के दौरान कम मेमोरी का उपयोग करेंगे (यह भी तेज़ होगा)।
reduce = function (key, values) {
result={a:[]};
values.forEach( function(v) {
result.a = v.a.concat(result.a);
} );
return result;
}
चूंकि मैं प्रत्येक कुंजी के लिए सभी मान रख रहा हूं, इसलिए मुझे प्रति कुंजी केवल नवीनतम पांच तत्वों को निकालने के लिए एक अंतिम कार्य की आवश्यकता है।
final = function (key, value) {
Array.prototype.sortByProp = function(p){
return this.sort(function(a,b){
return (a[p] < b[p]) ? 1 : (a[p] > b[p]) ? -1 : 0;
});
}
value.a.sortByProp('date');
return value.a.slice(0,5);
}
आपके द्वारा प्रदान किए गए टेम्पलेट दस्तावेज़ के समान टेम्पलेट का उपयोग करके, आप इसे mapReduce कमांड को कॉल करके चलाते हैं:
> db.top5.mapReduce(map, reduce, {finalize:final, out:{inline:1}})
{
"results" : [
{
"_id" : "group1",
"value" : [
{
"_id" : ObjectId("516f011fbfd3e39f184cfe13"),
"name" : "group1",
"date" : ISODate("2013-04-17T20:07:59.498Z"),
"contents" : 0.23778377776034176
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfe0e"),
"name" : "group1",
"date" : ISODate("2013-04-17T20:07:59.467Z"),
"contents" : 0.4434165076818317
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfe09"),
"name" : "group1",
"date" : ISODate("2013-04-17T20:07:59.436Z"),
"contents" : 0.5935856597498059
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfe04"),
"name" : "group1",
"date" : ISODate("2013-04-17T20:07:59.405Z"),
"contents" : 0.3912118375301361
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfdff"),
"name" : "group1",
"date" : ISODate("2013-04-17T20:07:59.372Z"),
"contents" : 0.221651989268139
}
]
},
{
"_id" : "group2",
"value" : [
{
"_id" : ObjectId("516f011fbfd3e39f184cfe14"),
"name" : "group2",
"date" : ISODate("2013-04-17T20:07:59.504Z"),
"contents" : 0.019611883210018277
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfe0f"),
"name" : "group2",
"date" : ISODate("2013-04-17T20:07:59.473Z"),
"contents" : 0.5670706110540777
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfe0a"),
"name" : "group2",
"date" : ISODate("2013-04-17T20:07:59.442Z"),
"contents" : 0.893193120136857
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfe05"),
"name" : "group2",
"date" : ISODate("2013-04-17T20:07:59.411Z"),
"contents" : 0.9496864483226091
},
{
"_id" : ObjectId("516f011fbfd3e39f184cfe00"),
"name" : "group2",
"date" : ISODate("2013-04-17T20:07:59.378Z"),
"contents" : 0.013748752186074853
}
]
},
{
"_id" : "group3",
...
}
]
}
],
"timeMillis" : 15,
"counts" : {
"input" : 80,
"emit" : 80,
"reduce" : 5,
"output" : 5
},
"ok" : 1,
}
प्रत्येक परिणाम में समूह नाम के रूप में _id होता है और उस समूह के नाम के संग्रह से सबसे हाल के पांच दस्तावेज़ों की सरणी के रूप में मान होते हैं।