चूंकि आपका प्रश्न वर्तमान में अस्पष्ट है, मैं वास्तव में आशा करता हूं कि आप दो Site
. निर्दिष्ट करना चाहते हैं कुंजियाँ और 2 Software
कुंजियाँ क्योंकि यह एक अच्छा और सरल उत्तर है जिसे आप अपने $match चरण में इस प्रकार जोड़ सकते हैं:
{$match: {
group_id: "20ea74df4f7074b33b520000",
tracked_item_name: {$in: ['Twitter', 'Facebook', 'Word', 'Excel' ] }
}},
और हम सब खुश हो सकते हैं और खुश हो सकते हैं;)
फिर भी यदि आपका प्रश्न कुछ और शैतानी है जैसे, शीर्ष 2 Sites
. प्राप्त करना और Software
अवधि के आधार पर परिणाम से प्रविष्टियां, तो हम इस घृणितता . को जन्म देने के लिए आपका बहुत-बहुत धन्यवाद करते हैं ।
चेतावनी:
आपका माइलेज इस बात पर भिन्न हो सकता है कि आप वास्तव में क्या करना चाहते हैं या क्या यह आपके परिणामों के विशाल आकार से उड़ने वाला है। लेकिन यह इस बात का उदाहरण है कि आप किस चीज के लिए हैं:
db.collection.aggregate([
// Match items first to reduce the set
{$match: {group_id: "20ea74df4f7074b33b520000" }},
// Group on the types and "sum" of duration
{$group: {
_id: {
tracked_item_type: "$tracked_item_type",
tracked_item_name: "$tracked_item_name"
},
duration: {$sum: "$duration"}
}},
// Sort by type and duration descending
{$sort: { "_id.tracked_item_type": 1, duration: -1 }},
/* The fun part */
// Re-shape results to "sites" and "software" arrays
{$group: {
_id: null,
sites: {$push:
{$cond: [
{$eq: ["$_id.tracked_item_type", "Site" ]},
{ _id: "$_id", duration: "$duration" },
null
]}
},
software: {$push:
{$cond: [
{$eq: ["$_id.tracked_item_type", "Software" ]},
{ _id: "$_id", duration: "$duration" },
null
]}
}
}},
// Remove the null values for "software"
{$unwind: "$software"},
{$match: { software: {$ne: null} }},
{$group: {
_id: "$_id",
software: {$push: "$software"},
sites: {$first: "$sites"}
}},
// Remove the null values for "sites"
{$unwind: "$sites"},
{$match: { sites: {$ne: null} }},
{$group: {
_id: "$_id",
software: {$first: "$software"},
sites: {$push: "$sites"}
}},
// Project out software and limit to the *top* 2 results
{$unwind: "$software"},
{$project: {
_id: 0,
_id: { _id: "$software._id", duration: "$software.duration" },
sites: "$sites"
}},
{$limit : 2},
// Project sites, grouping multiple software per key, requires a sort
// then limit the *top* 2 results
{$unwind: "$sites"},
{$group: {
_id: { _id: "$sites._id", duration: "$sites.duration" },
software: {$push: "$_id" }
}},
{$sort: { "_id.duration": -1 }},
{$limit: 2}
])
अब इसका परिणाम क्या होता है *बिल्कुल नहीं परिणामों का स्वच्छ सेट जो आदर्श होगा लेकिन यह ऐसा कुछ है जिसे प्रोग्राम के साथ काम किया जा सकता है, और पिछले परिणामों को लूप में फ़िल्टर करने से बेहतर है। (परीक्षण से मेरा डेटा)
{
"result" : [
{
"_id" : {
"_id" : {
"tracked_item_type" : "Site",
"tracked_item_name" : "Digital Blasphemy"
},
"duration" : 8000
},
"software" : [
{
"_id" : {
"tracked_item_type" : "Software",
"tracked_item_name" : "Word"
},
"duration" : 9540
},
{
"_id" : {
"tracked_item_type" : "Software",
"tracked_item_name" : "Notepad"
},
"duration" : 4000
}
]
},
{
"_id" : {
"_id" : {
"tracked_item_type" : "Site",
"tracked_item_name" : "Facebook"
},
"duration" : 7920
},
"software" : [
{
"_id" : {
"tracked_item_type" : "Software",
"tracked_item_name" : "Word"
},
"duration" : 9540
},
{
"_id" : {
"tracked_item_type" : "Software",
"tracked_item_name" : "Notepad"
},
"duration" : 4000
}
]
}
],
"ok" : 1
}
तो आप देखते हैं कि आपको शीर्ष 2 Sites
मिलते हैं सरणी में, शीर्ष 2 Software
. के साथ प्रत्येक में एम्बेडेड आइटम। स्वयं एकत्रीकरण, इसे और अधिक स्पष्ट नहीं कर सकता, क्योंकि हमें पुन:विलय . की आवश्यकता होगी ऐसा करने के लिए हम जिन वस्तुओं को अलग करते हैं, और अभी तक ऐसा कोई ऑपरेटर नहीं है जिसका उपयोग हम इस क्रिया को करने के लिए कर सकें।
लेकिन वह मजेदार था। यह सब नहीं है जिस तरह से किया गया है, लेकिन सबसे रास्ते में, और इसे 4 दस्तावेज़ प्रतिक्रिया में बनाना अपेक्षाकृत छोटा कोड होगा। लेकिन मेरा सिर पहले से ही दर्द कर रहा है।