【问题标题】:How to sum data after remove duplicate ($addToSet) mongoose aggregate删除重复 ($addToSet) mongoose 聚合后如何对数据求和
【发布时间】:2021-05-24 15:23:52
【问题描述】:

删除猫鼬中的重复项后,我很难对价值求和。我有这样的数据:

{
            "_id": "6006c7f624d9e1364051b0aa",
            "paidFrom": "5fec1b5d124c58c6ddacfd02",
            "amount": 234,
        },
        {
            "_id": "600e63f2545087cbddfe370a",
            "paidFrom": "5fec1b5d124c58c6ddacfd02",
            "amount": 25000,
        },
        {
            "_id": "600e7c16545087cbddfe370b",
            "paidFrom": "5ff56473609e930518cb7b67",
            "amount": 5000,

        },

我想使用聚合删除重复数据,我想用相同的支付值求和。

这是我的代码:

const dataAP = await AccountPayment.aggregate([
      { 
          $match: filterDate
      },
      {
        $group: {
            _id:  null,
            paidFrom: {
              "$addToSet" : "$paidFrom",
            },
            amount: {$sum: "$amount"}
        }
    },
    ], 
      function (err, res)
      {
          if (err) {} 
            console.log(err)
      });

但该代码给了我结果:

"status": "success",
    "data": [
        {
            "_id": null,
            "paidFrom": [
                "5ff56473609e930518cb7b67",
                "5fec1b5d124c58c6ddacfd02",
                "5ff54212609e930518cb7b65"
            ],
            "amount": 60234
        }
    ]
}

我的预期结果是:

"status": "success",
    "data": [
        {
            "_id": null,
            "paidFrom": [
                "5ff56473609e930518cb7b67",
            ],
            "amount": 20000
        },
{
            "_id": null,
            "paidFrom": [
                "5fec1b5d124c58c6ddacfd02",
            ],
            "amount": 20000
        },
{
            "_id": null,
            "paidFrom": [
                "5ff54212609e930518cb7b65",
            ],
            "amount": 20234
        },
    ]


}

我希望金额是重复值的总和,所以我可以计算重复值。有人可以告诉我有什么问题吗?谢谢

【问题讨论】:

  • 为什么paidFrom 需要是一个数组?如果我正确理解了这个问题,它总是只有一项。

标签: javascript node.js mongoose aggregate


【解决方案1】:

您只需按paidFrom id 和 sum 数量进行分组,它将对重复的文档和总和 amount 进行分组

const dataAP = await AccountPayment.aggregate([
  { $match: filterDate },
  {
    $group: {
      _id: "$paidFrom",
      amount: { $sum: "$amount" }
    }
  }
], 
function (err, res) {
  if (err) console.log(err);
})

Playground

【讨论】:

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