【问题标题】:Build the total sum of aggregated result构建聚合结果的总和
【发布时间】:2020-10-26 02:14:08
【问题描述】:

是否可以在聚合结果中添加一个字段?我的目标是对所有结果进行总和。目前,我只是减少结果,但我认为这不如通过查询解决它。

aggregate([
      {
        $match: {
          time: { $gte: start, $lte: end },
        },
      },
      {
        $group:
          {
            _id: { $dateToString: { format: '%Y-%m-%d', date: '$time' } },
            totalAmount: { $sum: '$payment.amount' },
          },
      },
    ]).exec().then((result) => {
      return {
        total: result.reduce(((acc, curr) => acc + curr.totalAmount), 0),
        dates: result,
      };
    });

结果是:

{
   "_id":"2020-06-06",
   "totalAmount":12
},
{
   "_id":"2020-07-06",
   "totalAmount":12
}

知道如何获得所有人的总数,看起来像这样但没有减少部分吗?

{
    "total": 24,
    "dates": [
        {
            "_id": "2020-06-06",
            "totalAmount": 12,      
        },
        {
            "_id": "2020-07-06",
            "totalAmount": 12,    
        }
    ]
}

【问题讨论】:

    标签: javascript mongodb typescript mongoose aggregation-framework


    【解决方案1】:

    您可以同时使用两个查询

    const [result, totalAmount] = await Promise.all([
      Model.aggregate([
        { $match: { time: { $gte: start, $lte: end } } },
        {
          $group: {
            _id: { $dateToString: { format: "%Y-%m-%d", date: "$time" } },
            totalAmount: { $sum: "$payment.amount" },
          }
        },
      ]),
      Model.aggregate([
        { $match: { time: { $gte: start, $lte: end } } },
        {
          $group: {
            _id: null,
            totalAmount: { $sum: "$payment.amount" },
          }
        },
      ])
    ])
    
    return {
      total: result,
      dates: totalAmount,
    }
    

    或者可以使用$facet

    const result = await Model.aggregate([
      { $match: { time: { $gte: start, $lte: end } } },
      {
        $facet: {
          result: [
            {
              $group: {
                _id: {
                  $dateToString: { format: "%Y-%m-%d", date: "$time" },
                },
                totalAmount: { $sum: "$payment.amount" },
              },
            },
          ],
          totalAmount: [
            {
              $group: {
                _id: null,
                totalAmount: { $sum: "$payment.amount" },
              },
            },
          ],
        },
      },
    ]);
    
    
    return {
      total: _.get(result, "[0].result", []),
      dates: _.get(result, "[0].totalAmount.totalAmount", 0),
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2021-04-06
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      相关资源
      最近更新 更多