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

MongoDB-aggregering for at tilføje manglende måneder mellem to datoer efter gruppering på datofelt

Først troede jeg, at dette nemt kan opnås gennem kode, men selv med MongoDB kan du gøre det, men med et input fra kode :

Lad os sige, om din fromDate er juni-2018 og til dato er juni-2019, så ved at bruge dit programmeringssprog kan du nemt få alle måneder mellem disse to datoer i dette format mm-åååå . Du kan prøve at gøre dette ved at bruge MongoDB, men jeg vil hellere foretrække som input til forespørgsel.

Forespørgsel:

db.collection.aggregate([
    {
      $group: {
        _id: {
          date: {
            $dateToString: {
              format: "%m-%Y",
              date: "$reviewUpdatedAt"
            }
          },
          loc: "$branchId"
        },
        Total: {
          $sum: 1
        }
      }
    },
    {
      $group: {
        _id: "$_id.loc",
        reviews: {
          $push: {
            Total: "$Total",
            "date": "$_id.date"
          }
        }
      }
    },
    /** Overwrite existing reviews field with new array, So forming new array :: 
     * as you're passing all months between these dates get a difference of two arrays (input dates - existing dates after group)
     * while will leave us with an array of missing dates, we would iterate on that missing dates array &
     * concat actual reviews array with each missing date
     * */
    {
      $addFields: {
        reviews: {
          $reduce: {
            input: {
              $setDifference: [
                [
                  "06-2018",
                  "07-2018",
                  "08-2018",
                  "09-2018",
                  "10-2018",
                  "11-2018",
                  "12-2018",
                  "01-2019",
                  "02-2019",
                  "03-2019",
                  "04-2019",
                  "05-2019",
                  "06-2019"
                ],
                "$reviews.date"
              ]
            },
            initialValue: "$reviews",
            in: {
              $concatArrays: [
                "$$value",
                [
                  {
                    date: "$$this",
                    Total: 0
                  }
                ]
              ]
            }
          }
        }
      }
    }
  ])

Test: MongoDB-Playground

Ref : javascript-get-all-months-between-two -datoer



  1. SQL COALESCE() Forklaret

  2. MongoDB beregner score fra eksisterende felter og sætter det i et nyt felt i samme samling

  3. Mongoose String til ObjectID

  4. Hvordan undertrykker man en kolonne i mongodb ved hjælp af Java-drivere?