sql >> Database teknologi >  >> NoSQL >> MongoDB

hvordan man viser 0 for uge, når ingen post matcher den uge i $week mongodb forespørgsel

Som $week kan returnere en værdi mellem 0 og 53 Jeg går ud fra, at du forventer 54 dokumenter som et resultat med 0 eller ikke-nul værdier for documentCount . For at opnå dette bør du samle alle dine dokumenter i ét ($ gruppe -ing af null ) og generer derefter output.

For at generere en række tal kan du bruge $range operator og derefter kan du generere outputtet ved hjælp af $map . For at omdanne en række dokumenter til flere dokumenter kan du bruge $ slappe af .

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"
        }
    }
])

Brug af $indexOfArray for at kontrollere, om rækken af ​​aktuelle dokumenter indeholder dokumentet (-1 ellers) og $arrayElemAt for at hente eksisterende dokument fra docs . Sidste trin ($replaceRoot ) er bare at slippe af med ét niveau af nesting (docs ). Udgange:

{ "_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 }

Du kan nemt tilpasse returnerede resultater ved at ændre input af $map scene. Du kan f.eks. sende en række konster som input: [21, 22, 23, 24] også.

EDIT:For at få ugerne mellem angivne datoer kan du bruge $week for start- og slutdato for at få tallene.




  1. 3 enkle trin til at oprette MongoDB Sharded Clusters

  2. Opdater MongoDB-samling ved hjælp af $toLower

  3. mongoDB:hvordan man vender $unwind

  4. Hvordan kopierer jeg en samling fra en database til en anden database på den samme server ved hjælp af PyMongo?