$week
के रूप में 0
. के बीच एक मान लौटा सकता है और 53
मुझे लगता है कि आप उम्मीद करते हैं 54
0
. के साथ परिणाम के रूप में दस्तावेज़ या documentCount
. के लिए गैर-शून्य मान . इसे प्राप्त करने के लिए आपको अपने सभी दस्तावेज़ों को एक में एकत्रित करना चाहिए ($ समूह
null
. द्वारा -ing ) और फिर आउटपुट जेनरेट करें।
संख्याओं की एक श्रृंखला उत्पन्न करने के लिए आप $rangeका उपयोग कर सकते हैं। ए> ऑपरेटर और फिर आप $mapका उपयोग करके आउटपुट जेनरेट कर सकते हैं। ए> . दस्तावेज़ों की एक सरणी को एकाधिक दस्तावेज़ों में बदलने के लिए आप $ का उपयोग कर सकते हैं। आराम करें ।
db.collectionName.aggregate([
//where query
{ "$match": { $and:[{CreatedOn:{$lte:ISODate("2018-07-14T13:59:08.266+05:30")}},{CreatedOn:{$gte:ISODate("2018-06-10T13:59:08.266+05:30")}}] } },
//distinct column
{
"$group": {
_id: {$week: '$CreatedOn'},
documentCount: {$sum: 1}
}
},
{
$group: {
_id: null,
docs: { $push: "$$ROOT" }
}
},
{
$project: {
docs: {
$map: {
input: { $range: [ {$week:ISODate("2018-06-10T13:59:08.266+05:30")}, {$week:ISODate("2018-07-14T13:59:08.266+05:30")}]},
as: "weekNumber",
in: {
$let: {
vars: { index: { $indexOfArray: [ "$docs._id", "$$weekNumber" ] } },
in: {
$cond: {
if: { $eq: [ "$$index", -1 ] },
then: { _id: "$$weekNumber", documentCount: 0 },
else: { $arrayElemAt: [ "$docs", "$$index" ] }
}
}
}
}
}
}
}
},
{
$unwind: "$docs"
},
{
$replaceRoot: {
newRoot: "$docs"
}
}
])
$indexOfArray
का उपयोग करना यह जाँचने के लिए कि क्या वर्तमान दस्तावेज़ों की सरणी में दस्तावेज़ (-1 अन्यथा) है और $arrayElemAt
docs
. से मौजूदा दस्तावेज़ प्राप्त करने के लिए . अंतिम चरण ($replaceRoot
) केवल एक स्तर के नेस्टिंग से छुटकारा पाने के लिए है (docs
) आउटपुट:
{ "_id" : 0, "documentCount" : 0 }
{ "_id" : 1, "documentCount" : 0 }
{ "_id" : 2, "documentCount" : 0 }
...
{ "_id" : 22, "documentCount" : 0 }
{ "_id" : 23, "documentCount" : 2 }
{ "_id" : 24, "documentCount" : 9 }
{ "_id" : 25, "documentCount" : 1 }
{ "_id" : 26, "documentCount" : 1 }
{ "_id" : 27, "documentCount" : 0 }
...
{ "_id" : 52, "documentCount" : 0 }
{ "_id" : 53, "documentCount" : 0 }
आप $map
. के इनपुट को संशोधित करके लौटाए गए परिणामों को आसानी से अनुकूलित कर सकते हैं मंच। उदाहरण के लिए आप input: [21, 22, 23, 24]
जैसे कॉन्स्टेबल की एक सरणी पास कर सकते हैं साथ ही।
संपादित करें:निर्दिष्ट तिथियों के बीच सप्ताह प्राप्त करने के लिए आप $week
. का उपयोग कर सकते हैं नंबर प्राप्त करने के लिए प्रारंभ और समाप्ति तिथि के लिए।