यहां एक एकत्रीकरण है जो प्रत्येक श्रेणी में अवधि के अनुसार शीर्ष दो को ढूंढता है (यह मनमाने ढंग से "संबंधों" को तोड़ता है, जो आपके नमूना आउटपुट के अनुरूप लगता है):
var pregroup = { "$group" : {
"_id" : {
"type" : "$tracked_item_type",
"name" : "$tracked_item_name"
},
"duration" : {
"$sum" : "$duration"
}
}
};
var sort = { "$sort" : { "_id.type" : 1, "duration" : -1 } };
var group1 = { "$group" : {
"_id" : "$_id.type",
"num1" : {
"$first" : {
"name" : "$_id.name",
"dur" : "$duration"
}
},
"other" : {
"$push" : {
"name" : "$_id.name",
"dur" : "$duration"
}
},
"all" : {
"$push" : {
"name" : "$_id.name",
"dur" : "$duration"
}
}
}
};
var unwind = { "$unwind" : "$other" };
project = {
"$project" : {
"keep" : {
"$ne" : [
"$num1.name",
"$other.name"
]
},
"num1" : 1,
"all" : 1,
"other" : 1
}
};
var match = { "$match" : { "keep" : true } };
var sort2 = { "$sort" : { "_id" : 1, "other.dur" : -1 } };
var group2 = { "$group" : {
"_id" : "$_id",
"numberOne" : {
"$first" : "$num1"
},
"numberTwo" : {
"$first" : "$other"
},
"all" : {
"$first" : "$all"
}
}
};
unwind2 = { "$unwind" : "$all" };
project2 = { "$project" : {
"_id" : 0,
"tracked_item_type" : "$_id",
"tracked_item_name" : {
"$cond" : [
{
"$or" : [
{
"$eq" : [
"$all.name",
"$numberOne.name"
]
},
{
"$eq" : [
"$all.name",
"$numberTwo.name"
]
}
]
},
"$all.name",
null
]
},
"duration" : {
"$cond" : [
{
"$or" : [
{
"$eq" : [
"$all.name",
"$numberOne.name"
]
},
{
"$eq" : [
"$all.name",
"$numberTwo.name"
]
}
]
},
"$all.dur",
null
]
}
}
}
match2 = { "$match" : { "tracked_item_name" : { "$ne" : null } } };
इसे अपने नमूना डेटा के साथ चलाना:
db.top2.aggregate(pregroup, sort, group1, unwind, project, match, sort2, group2, unwind2, project2, match2).toArray()
[
{
"tracked_item_type" : "Software",
"tracked_item_name" : "Word",
"duration" : 9540
},
{
"tracked_item_type" : "Software",
"tracked_item_name" : "Notepad",
"duration" : 4000
},
{
"tracked_item_type" : "Site",
"tracked_item_name" : "Digital Blasphemy",
"duration" : 8000
},
{
"tracked_item_type" : "Site",
"tracked_item_name" : "Facebook",
"duration" : 7920
}
]
यह डोमेन की मनमानी संख्या (विभिन्न ट्रैक किए गए आइटम प्रकार मान) के साथ काम करेगा और आपको उनके सभी नामों को पहले से जानने की आवश्यकता नहीं है। हालांकि, इसे शीर्ष तीन में सामान्य करने के लिए, शीर्ष चार, शीर्ष पांच, आदि प्रत्येक अतिरिक्त शीर्ष "एन" मान के लिए चार और चरण जोड़ देंगे - बहुत व्यावहारिक या सुंदर नहीं।
एकत्रीकरण ढांचे में "शीर्ष एन" कार्यक्षमता का अधिक मूल कार्यान्वयन प्राप्त करने के लिए कृपया इस जीरा टिकट को वोट दें।