Javascript 获取MongoDB中重复文档集合中唯一文档的值之和

Javascript 获取MongoDB中重复文档集合中唯一文档的值之和,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我是MongoDB的新手,我被困在下面的场景中 我有一个包含重复文档的集合。 我只想得到每个文档中属性的总和,不包括重复的文档 我的文档如下所示: {"_id":"5dd629461fc50b782479ea90", "referenceId":"5dd581f10859d2737965d23a", "sellingId":"319723fb80b1a297cf0803abad9bc60787537f14a6a37d6e47", "account_name":"mrfsahas1234", "v

我是MongoDB的新手,我被困在下面的场景中

我有一个包含重复文档的集合。 我只想得到每个文档中属性的总和,不包括重复的文档

我的文档如下所示:

{"_id":"5dd629461fc50b782479ea90",
"referenceId":"5dd581f10859d2737965d23a",
"sellingId":"319723fb80b1a297cf0803abad9bc60787537f14a6a37d6e47",
"account_name":"mrfsahas1234",
"vendor_name":"testaccount2",
"action_type":"purchase",
"product_name":"Bottle",
"product_quantity":10,
"transactionId":"319723fb80b1a297cf0803abad9bc60787537f14a6a37d6e47",
"uid":"2019-11-20T17:39:17.405Z",
"createdAt":"2019-11-21T08:56:56.589+00:00",
"updatedAt":"2019-11-21T08:56:56.589+00:00","__v":0
},
{
"_id":"5dd629461fc50b782479ea90",
"referenceId":"5dd581f10859d2737965d23a",  
"sellingId":"320a9a2f814a45e01eb98344c9af708fa2864d81587e5914",
 "account_name":"mrfsahas1234",
 "vendor_name":"testaccount2",
 "action_type":"purchase",
 "product_name":"Bottle",
 "product_quantity":50, 
 "transactionId":"320a9a2f814a45e01eb98344c9af708fa2864d81587e5914",
 "uid":"2019-11-20T17:39:17.405Z",
},
{
"_id":"5dd629461fc50b782479ea90",
"referenceId":"5dd581f10859d2737965d23a",  
"sellingId":"320a9a2f814a45e01eb98344c9af708fa2864d81587e5914",
 "account_name":"mrfsahas1234",
 "vendor_name":"testaccount2",
 "action_type":"purchase",
 "product_name":"Bottle",
 "product_quantity":50, 
 "transactionId":"320a9a2f814a45e01eb98344c9af708fa2864d81587e5914",
 "uid":"2019-11-20T17:39:17.405Z",
},
目前,我正在这样做:

MaterialsTrack.aggregate([
            {
                $match: {
                    $and: [
                        {product_name: product_name},
                        {account_name: account_name},
                        {action_type: 'purchase'},
                        {uid:uid}
                    ]
                }
            },
            {
                $group: {_id: "$sellingId", PurchseQuantity: {$sum: "$product_quantity"}}
            },
        ])
返回所有匹配单据(包括重复单据)的
产品数量
之和。 电流输出:

{_id: "320a9a2f814a45e01eb98344c9af708fa2864d81587e5914", PurchseQuantity:110}
预期产出:

{_id: "320a9a2f814a45e01eb98344c9af708fa2864d81587e5914", PurchseQuantity:60}
我只想得到唯一文档的总和。我怎样才能做到呢?
提前谢谢

将$addToSet添加到聚合管道中怎么样

MaterialsTrack.aggregate([
            {
                $match: {
                    $and: [
                        {product_name: product_name},
                        {account_name: account_name},
                        {action_type: 'purchase'},
                        {uid:uid}
                    ]
                }
            },
            {
                $group: {_id: "$sellingId", PurchseQuantity: {$sum: "$product_quantity"},"list" : {$addToSet : "$list"}}
            },
        ])

将$addToSet添加到聚合管道中怎么样

MaterialsTrack.aggregate([
            {
                $match: {
                    $and: [
                        {product_name: product_name},
                        {account_name: account_name},
                        {action_type: 'purchase'},
                        {uid:uid}
                    ]
                }
            },
            {
                $group: {_id: "$sellingId", PurchseQuantity: {$sum: "$product_quantity"},"list" : {$addToSet : "$list"}}
            },
        ])

您需要在$group\u id字段中求和,然后使用来获得您想要的结果

MaterialsTrack.aggregate([
  {
    $match: {
      $and: [
        {
          product_name: "Bottle"
        },
        {
          account_name: "mrfsahas1234"
        },
        {
          action_type: "purchase"
        },
        {
          uid: "2019-11-20T17:39:17.405Z"
        }
      ]
    }
  },
  {
    $group: {
      _id: {
        sellingId: "$sellingId",
        PurchaseQuantity: {
          $sum: "$product_quantity"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        _id: "$_id.sellingId",
        PurchaseQuantity: "$_id.PurchaseQuantity"
      }
    }
  }
]);
样本输出:

[
  {
    "PurchaseQuantity": 50,
    "_id": "320a9a2f814a45e01eb98344c9af708fa2864d81587e5914"
  }
]
游乐场:


您需要在$group\u id字段内求和,然后使用来获得所需的结果

MaterialsTrack.aggregate([
  {
    $match: {
      $and: [
        {
          product_name: "Bottle"
        },
        {
          account_name: "mrfsahas1234"
        },
        {
          action_type: "purchase"
        },
        {
          uid: "2019-11-20T17:39:17.405Z"
        }
      ]
    }
  },
  {
    $group: {
      _id: {
        sellingId: "$sellingId",
        PurchaseQuantity: {
          $sum: "$product_quantity"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        _id: "$_id.sellingId",
        PurchaseQuantity: "$_id.PurchaseQuantity"
      }
    }
  }
]);
样本输出:

[
  {
    "PurchaseQuantity": 50,
    "_id": "320a9a2f814a45e01eb98344c9af708fa2864d81587e5914"
  }
]
游乐场:


您需要不同的值。看到这一点,您需要不同的值。嘿,伙计们,很抱歉打扰你们,但我不明白这是怎么回事。在这个操场上,它似乎返回了100个数量,我是否遗漏了什么@SaumayPaul$group:{u id:$sellingId',purchRequesty:{$addToSet:$product_quantity}正在为其工作me@Ahmed我已经更新了我的问题,你介意看一下吗?在收集和输出预期中添加了一个新文档嘿,伙计们,很抱歉打扰你们,但我不明白这是怎么回事。在这个操场上,它似乎返回了100个数量,我是否遗漏了什么@SaumayPaul$group:{u id:$sellingId',purchRequesty:{$addToSet:$product_quantity}正在为其工作me@Ahmed我已经更新了我的问题,你介意看一下吗?在收集和输出期望中添加了一个新的文档-我使用了$group:{u id:$sellingId',purchRequesty:{$addToSet:$product_quantity}。在得到结果后,我将以-res['data']['purchRequesty'][0]的形式访问数据,但我也喜欢您的方法。向上投票@谢谢你的解释。因此,接受的答案必须以这种方式编辑。您还可以通过replaceRoot来塑造结果,而无需在应用程序中执行此操作。我认为我的解决方案更好:)我没有得到完美的结果。我已经更新了我的问题。你介意看一下吗?@SaumayPaul你能告诉我们,如果文件是重复的,我们怎么能理解?哪些字段必须相同才能被视为重复我使用了$group:{{u id:$sellingId],purchRequesty:{$addToSet:“$product\u quantity”}。在得到结果后,我将以-res['data']['purchRequesty'][0]的形式访问数据,但我也喜欢您的方法。向上投票@谢谢你的解释。因此,接受的答案必须以这种方式编辑。您还可以通过replaceRoot来塑造结果,而无需在应用程序中执行此操作。我认为我的解决方案更好:)我没有得到完美的结果。我已经更新了我的问题。你介意看一下吗?@SaumayPaul你能告诉我们,如果文件是重复的,我们怎么能理解?哪些字段必须相同才能被视为重复?