MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Aggregation zum Hinzufügen fehlender Monate zwischen zwei Daten nach Gruppierung nach Datumsfeld

Zuerst dachte ich, dass dies einfach durch Code erreicht werden kann, aber selbst mit MongoDB können Sie das tun, aber mit einer Eingabe von code :

Angenommen, Ihr fromDate ist Juni-2018 &toDate ist Juni-2019, dann können Sie mit Ihrer Programmiersprache ganz einfach alle Monate zwischen diesen beiden Daten in diesem Format MM-JJJJ abrufen . Sie können versuchen, dies mit MongoDB zu tun, aber ich würde es lieber als Eingabe für die Abfrage bevorzugen.

Abfrage :

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-Spielplatz

Referenz: javascript-get-all-months-between-two -Termine