sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB-aggregation för att lägga till saknade månader mellan två datum efter gruppering på datumfält

Först trodde jag att detta enkelt kan uppnås genom kod, men även med MongoDB kan du göra det men med en ingång från kod :

Låt oss säga om din fromDate är juni 2018 och toDate är juni-2019, då genom att använda ditt programmeringsspråk kan du enkelt få alla månader mellan dessa två datum i det här formatet mm-åååå . Du kan försöka göra detta med MongoDB men jag skulle hellre föredra som en indata för att fråga.

Fråga:

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



  1. MongoDB c# hämtar alla matchande element i en array i ett dokument med hjälp av definitionsbyggaren

  2. Få storleken på alla dokument i en fråga

  3. Exekveringen av Mongodb-frågan tar för mycket tid

  4. Hur man tar bort dubbletter av värden i en lista i mongodb