sql >> Database >  >> NoSQL >> MongoDB

MongoDB-aggregatie om ontbrekende maanden tussen twee datums toe te voegen na groepering op datumveld

In eerste instantie dacht ik dat dit gemakkelijk met code kon worden bereikt, maar zelfs met MongoDB kun je dat doen, maar met een invoer van code:

Stel dat uw fromDate is juni-2018 &toDate is juni-2019, dan kun je door je programmeertaal te gebruiken gemakkelijk alle maanden tussen die twee datums krijgen in dit formaat mm-jjjj . Je kunt proberen om dit te doen met MongoDB, maar ik heb liever een invoer voor een query.

Vraag:

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



  1. MongoDB Regular Expression Search - Begint met het gebruik van javascript-stuurprogramma en NodeJS

  2. Groovy kon geen overeenkomende constructor vinden?

  3. Caching van MongoDB-verbindingen in Django

  4. Hoe u het serveradres kunt krijgen van de server waarvan de gegevens worden opgehaald?