MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

как да се покаже 0 за седмица, когато нито един запис не съответства на тази седмица в $week mongodb заявка

Като $week може да върне стойност между 0 и 53 Предполагам, че очаквате 54 документи като резултат с 0 или ненулеви стойности за documentCount . За да постигнете това, трябва да съберете всичките си документи в едно ($ група -ing от null ) и след това генерирайте изхода.

За да генерирате диапазон от числа, можете да използвате $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 сцена. Например можете да подадете масив от const като input: [21, 22, 23, 24] както и.

РЕДАКТИРАНЕ:За да получите седмиците между посочените дати, можете да използвате $week за начална и крайна дата, за да получите числата.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. NodeJS Knox Formidable води до 400, файлът не е качен в S3 Bucket

  2. конвертиране на база данни от mysql в mongoDb

  3. Не може да се стартира MongoDB:системна грешка 1067 в Windows

  4. Как да направите заявка за всички поддокументи

  5. Как се сортират нулевите стойности в MongoDB индекс?