如何在MongoDB中获得过去2年相对于给定时期内每个月的销售额的滚动总和?

qjp7pelc  于 2023-05-06  发布在  Go
关注(0)|答案(1)|浏览(137)

正如标题所说,我想,对于给定时期内的每个月,获得过去24个月的滚动总和。
英语不是我的母语,所以我想澄清一下:假设我定义了一个从2020年1月开始到2022年1月结束的时间段。
对于这段时间内的每个月,我想计算前24个月的总销售额。
例如,对于2020年1月,我将计算2018年1月****(这很重要,因为该期间从2020年开始,但我必须计算前两年相对于我处理的月份的销售额)和2020年1月之间的所有销售额。对于2020年2月,我将对2018年2月至2020年2月之间的所有销售额进行求和,以此类推。
我的销售收藏看起来像这样:

[
  {
    saleDate: ISODate("2018-01-01"),
    salesCount: 121,
  },
  {
    saleDate: ISODate("2018-01-02"),
    salesCount: 234,
  },
  {
    saleDate: ISODate("2018-01-03"),
    salesCount: 521,
  }
]

因此,我想得到这样的东西:

[
  {
    year: 2020,
    month: 1,
    lastTwoYearSales: 8198
  },
  {
    year: 2020,
    month: 2,
    lastTwoYearSales: 9928
  },
  {
    year: 2020,
    month: 3,
    lastTwoYearSales: 9218
  },
  ...
  {
    year: 2022,
    month: 1,
    lastTwoYearSales: 11219
  }
]

以下是我到目前为止使用聚合管道所做的:

[
  {
    $match: {
      saleDate: {
        $gte: ISODate("2018-01-01"),
        $lt: ISODate("2022-02-01")
      }
    }
  },
  {
    $group: {
      _id: {
        year: { $year: "$saleDate" },
        month: { $month: "$saleDate" }
      },
      monthlySales: { $sum: "$salesCount" }
    }
  },
  {
    $group: {
      _id: "$_id.month",
      monthly_sales: {
        $push: {
          year: "$_id.year",
          monthlySales: "$monthlySales"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      month: "$_id",
      rolling_sum: {
        $map: {
          input: "$monthly_sales",
          as: "sales",
          in: {
            year: "$$sales.year",
            monthlySales: {
              $sum: {
                $cond: [
                  { $gte: ["$$sales.year", { $subtract: ["$_id", 2] }] },
                  "$$sales.monthlySales",
                  0
                ]
              }
            }
          }
        }
      }
    }
  }
]

这是我所能做的,但是上面的查询有几个问题。
首先,它总结了整个前两年。即使我目前处理的是2021年7月,它也会将2019年1月至6月的销售额包括在总和中。
它还将计算过去2年到期末的销售额,而不是当月的销售额。我不知道该怎么做。
先谢谢你了!

bxgwgixi

bxgwgixi1#

你能尝试下面的查询和检查,如果这有助于您的要求?

[
  {
    $match: {
      saleDate: {
        $gte: ISODate("2018-01-01"),
        $lt: ISODate("2022-02-01")
      }
    }
  },
  {
    $group: {
      _id: {
        year: { $year: "$saleDate" },
        month: { $month: "$saleDate" }
      },
      monthlySales: { $sum: "$salesCount" }
    }
  },
  {
    $sort: {
      "_id.year": 1,
      "_id.month": 1
    }
  },
  {
    $group: {
      _id: null,
      monthly_sales: {
        $push: {
          year: "$_id.year",
          month: "$_id.month",
          monthlySales: "$monthlySales"
        }
      }
    }
  },
  {
    $unwind: "$monthly_sales"
  },
  {
    $group: {
      _id: "$monthly_sales.month",
      sales: { $push: "$monthly_sales" }
    }
  },
  {
    $project: {
      _id: 0,
      month: "$_id",
      rolling_sum: {
        $map: {
          input: "$sales",
          as: "sale",
          in: {
            year: "$$sale.year",
            month: "$$sale.month",
            lastTwoYearSales: {
              $reduce: {
                input: {
                  $slice: [
                    "$sales",
                    { $subtract: ["$$sale.month", 24] },
                    "$$sale.month"
                  ]
                },
                initialValue: 0,
                in: { $sum: "$$this.monthlySales" }
              }
            }
          }
        }
      }
    }
  },
  {
    $unwind: "$rolling_sum"
  },
  {
    $replaceRoot: {
      newRoot: "$rolling_sum"
    }
  }
]

相关问题