猫鼬总结具有相同别名的子文档数组元素

Mongoose Summing Up subdocument array elements having same alias

我有这样一个文档:

  _id:'someId',
  sales: 
     [
      {
       _id:'111',
       alias:'xxx',
       amount:500,
       name: Apple, //items with same alias always have same name and quantity
       quantity:2

     },
     {
       _id:'222',
       alias:'abc',
       amount:100,
       name: Orange,
       quantity:14
     },
     {
      _id:'333',
      alias:'xxx',
      amount:300,
      name: Apple, //items with same alias always have same name and quantity
      quantity:2
     }
    ]

alias 字段在这里 'group' items/documents 只要它们看起来具有相同的别名,即 'embeded' 与总金额。

我需要以这样的方式显示某种报告,即那些具有相同别名的元素应显示为 ONE 而其他不共享相同的元素别名保持原样。

例如,对于上面的示例文档,我需要这样的输出

[
 {
   alias:'xxx',
   amount:800
 },
 {
   alias:'abc',
   amount:100
 }
]

我尝试了什么

MyShop.aggregate([

{$group:{

 _id: "$_id",
 sales:{$last :"$sales"}
},

{$project:{
  "sales.amount":1
}}

}

])

这只是显示为 'list',而不考虑别名。如何实现根据别名汇总金额?

您可以使用以下聚合

db.collection.aggregate([
  {
    "$addFields": {
      "sales": {
        "$map": {
          "input": {
            "$setUnion": [
              "$sales.alias"
            ]
          },
          "as": "m",
          "in": {
            "$let": {
              "vars": {
                "a": {
                  "$filter": {
                    "input": "$sales",
                    "as": "d",
                    "cond": {
                      "$eq": [
                        "$$d.alias",
                        "$$m"
                      ]
                    }
                  }
                }
              },
              "in": {
                "amount": {
                  "$sum": "$$a.amount"
                },
                "alias": "$$m",
                "_idsInvolved": "$$a._id"
              }
            }
          }
        }
      }
    }
  }
])

MongoPlayground

您可以使用 $group

实现此目的
db.collection.aggregate([
  {
    $unwind: "$sales"
  },
  {
    $group: {
      _id: {
        _id: "$_id",
        alias: "$sales.alias"
      },
      sales: {
        $first: "$sales"
      },
      _idsInvolved: {
        $push: "$sales._id"
      },
      amount: {
        $sum: "$sales.amount"
      }
    }
  },
  {
    $group: {
      _id: "$_id._id",
      sales: {
        $push: {
          $mergeObjects: [
            "$sales",
            {
              alias: "$_id.alias",
              amount: "$amount",
              _idsInvolved: "$_idsInvolved"
            }
          ]
        }
      }
    }
  }
])

Mongo Playground