删除重复 ($addToSet) mongoose 聚合后如何对数据求和

Posted

技术标签:

【中文标题】删除重复 ($addToSet) mongoose 聚合后如何对数据求和【英文标题】:How to sum data after remove duplicate ($addToSet) mongoose aggregate 【发布时间】: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 需要是一个数组?如果我正确理解了这个问题,它总是只有一项。 【参考方案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

【讨论】:

以上是关于删除重复 ($addToSet) mongoose 聚合后如何对数据求和的主要内容,如果未能解决你的问题,请参考以下文章

在对象数组上使用 Mongoose / MongoDB $addToSet 功能

如何使用带有 Mongoose 的 addToSet 添加多个 ObjectId?

如何在 Mongoose 中使用 $addToSet 和 ObjectId 数组?

$ addToSet到一个数组,但它给我null

Mongoose Schema中Array内的重复值

mongodb删除重复数据