MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Agrégation MongoDB pour ajouter les mois manquants entre deux dates après regroupement sur le champ de date

Au début, je pensais que cela pouvait être facilement réalisé via le code, mais même avec MongoDB, vous pouvez le faire, mais avec une entrée de code :

Disons si votre fromDate est juin 2018 et à ce jour est juin 2019, alors en utilisant votre langage de programmation, vous pouvez facilement obtenir tous les mois entre ces deux dates dans ce format mm-aaaa . Vous pouvez essayer de le faire en utilisant MongoDB mais je préférerais plutôt comme entrée pour interroger.

Requête :

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

Tester : MongoDB-Playground

Réf : javascript-get-all-months-between-two -dates