वर्तमान तिथि सीमा के बीच कहां आती है, इसके आधार पर आपको समूहीकरण कुंजी को सशर्त रूप से निर्धारित करने की आवश्यकता है। यह मूल रूप से $cond
के ज़रिए हासिल किया जाता है
नेस्टेड शर्तों और $lt<के तार्किक संस्करण के साथ /कोड>
:
// work out dates somehow
var today = new Date(),
oneDay = ( 1000 * 60 * 60 * 24 ),
thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) ),
fifteenDays = new Date( today.valueOf() - ( 15 * oneDay ) ),
sevenDays = new Date( today.valueOf() - ( 7 * oneDay ) );
db.collection.aggregate([
{ "$match": {
"date": { "$gte": thirtyDays }
}},
{ "$group": {
"_id": {
"$cond": [
{ "$lt": [ "$date", fifteenDays ] },
"16-30",
{ "$cond": [
{ "$lt": [ "$date", sevenDays ] },
"08-15",
"01-07"
]}
]
},
"count": { "$sum": 1 },
"totalValue": { "$sum": "$value" }
}}
])
$cond
. के रूप में एक टर्नरी ऑपरेटर है, पहली शर्त का मूल्यांकन यह देखने के लिए किया जाता है कि क्या स्थिति सत्य है, और जब सत्य है तो दूसरा तर्क वापस कर दिया जाता है अन्यथा गलत होने पर तीसरा वापस कर दिया जाता है। तो एक और $cond
नेस्ट करके झूठे मामले में आपको तार्किक परीक्षण मिलता है जहां तारीख गिरती है, या तो "15 दिन की तारीख से कम" जिसका अर्थ है कि यह सबसे पुरानी सीमा में है, या "7 दिनों से कम" जिसका अर्थ मध्य सीमा है, या निश्चित रूप से यह अंदर है नवीनतम श्रेणी।
मैं यहां केवल 10 से कम की संख्याओं को 0
. के साथ उपसर्ग कर रहा हूं इसलिए यदि आप चाहते हैं तो यह आपको क्रमबद्ध करने के लिए कुछ देता है, क्योंकि $group
में "कुंजी" के आउटपुट के बाद से अपने आप में आदेशित नहीं है।
लेकिन इस तरह आप इसे एक ही प्रश्न में करते हैं। आप केवल यह निर्धारित करते हैं कि समूह कुंजी क्या होनी चाहिए, इस पर आधारित होना चाहिए कि प्रत्येक कुंजी के लिए दिनांक कहां गिरती है और जमा होती है।