यह वास्तव में एक सवाल है कि आप आउटपुट की तरह दिखने की उम्मीद करते हैं, क्योंकि किसी भी समेकित परिणाम को अनिवार्य रूप से निम्नतम स्तर पर समूहित करने की आवश्यकता होती है और फिर सबसे बड़े स्तर ("महीने") तक पहुंचने तक उच्च "अनाज" पर समूह की आवश्यकता होती है। इस प्रकार का अर्थ अंततः "माह" द्वारा समूहीकृत डेटा है, जब तक कि आप इसे अन्यथा नहीं तोड़ते।
संक्षेप में, उत्तरोत्तर $group
:
db.collection.aggregate([
// First total per day. Rounding dates with math here
{ "$group": {
"_id": {
"$add": [
{ "$subtract": [
{ "$subtract": [ "$createdAt", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$createdAt", new Date(0) ] },
1000 * 60 * 60 * 24
]}
]},
new Date(0)
]
},
"week": { "$first": { "$week": "$createdAt" } },
"month": { "$first": { "$month": "$createdAt" } },
"total": { "$sum": "$num" }
}},
// Then group by week
{ "$group": {
"_id": "$week",
"month": { "$first": "$month" },
"days": {
"$push": {
"day": "$_id",
"total": "$total"
}
},
"total": { "$sum": "$total" }
}},
// Then group by month
{ "$group": {
"_id": "$month",
"weeks": {
"$push": {
"week": "$_id",
"total": "$total",
"days": "$days"
}
},
"total": { "$sum": "$total" }
}}
])
इसलिए पहले के बाद प्रत्येक स्तर जो प्रति दिन योग करता है, उसके "राउंड अप" मान के लिए क्रमिक रूप से सरणी सामग्री में धकेल दिया जाता है और योग को उस स्तर पर भी जोड़ दिया जाता है।
यदि आप प्रति दिन एक रिकॉर्ड के साथ एक चापलूसी आउटपुट चाहते हैं जिसमें यह साप्ताहिक और मासिक योग के साथ-साथ दिन का कुल योग है, तो बस दो $unwind
संलग्न करें पाइपलाइन के अंत तक बयान:
{ "$unwind": "$weeks" },
{ "$unwind": "$weeks.days" }
और वैकल्पिक रूप से $project
"बिंदीदार" फ़ील्ड कुछ चापलूसी और पठनीय अगर आपको चाहिए।
यदि आप इसके साथ "वर्षों" का विस्तार कर रहे हैं, तो कम से कम "सप्ताह" स्तर से ग्रुपिंग कुंजी में इस तरह के एक ऑपरेशन को शामिल करें ताकि आप संभवतः अलग-अलग वर्षों के डेटा को संयोजित न करें और वे अलग हो जाएं।
"date math"
का उपयोग करना मेरी अपनी सामान्य प्राथमिकता भी है। तारीखों को गोल करते समय दृष्टिकोण करें क्योंकि यह एक Date
लौटाता है ऑब्जेक्ट, लेकिन जैसा कि "दिन" के अलावा अन्य स्तरों पर उपयोग किया जाता है, आप वैकल्पिक रूप से तारीख एग्रीगेशन ऑपरेटर्स
इसके बजाय।
mapReduce
. की कोई आवश्यकता नहीं है क्योंकि यह काफी सहज है और एक महीने में दिनों की एक सीमित मात्रा होती है, जिसका अर्थ है कि बीएसओएन सीमा जब सामग्री में नेस्टिंग एरे को एकत्र करते समय तोड़ा नहीं जाएगा।