MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

सप्ताह के लिए 0 कैसे दिखाना है जब उस सप्ताह $week mongodb क्वेरी में कोई रिकॉर्ड मेल नहीं खाता है

$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 . का उपयोग कर सकते हैं नंबर प्राप्त करने के लिए प्रारंभ और समाप्ति तिथि के लिए।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:कक्षा java.lang.Double को कक्षा java.lang.Long में नहीं डाला जा सकता है

  2. पिछले mongoDB दस्तावेज़ को कंपाउंड इंडेक्स से कैसे प्राप्त करें

  3. एकाधिक आईडी के साथ मोंगोडीबी समूह

  4. स्प्रिंग डेटा (गतिशील फ़ील्ड) का उपयोग करके अशक्त सूचक अपवाद मोंगो एकत्रीकरण प्राप्त करना

  5. IntelliJ में काम नहीं कर रहे ग्रैडल निर्भरताएं