【问题标题】:how to get wanted result from mongo aggregation如何从 mongo 聚合中获得想要的结果
【发布时间】:2020-04-20 17:54:10
【问题描述】:

在 mongo 项目集合中有这样的数据:

> db.items.find()
{ "_id" : ObjectId("5e9d57f8b018eecfd91c785a"), "customer_id" : 1, "goods_id" : 10, "op_code" : 1, "op_value" : 5 }
{ "_id" : ObjectId("5e9d57f8b018eecfd91c785b"), "customer_id" : 1, "goods_id" : 10, "op_code" : 1, "op_value" : 2 }
{ "_id" : ObjectId("5e9d57f8b018eecfd91c785c"), "customer_id" : 1, "goods_id" : 10, "op_code" : 2, "op_value" : 5 }

“op_code”字段代表加减运算(值为1表示加运算,2表示减),“op_value”字段为绝对值。如何按“customer_id”和“goods_id”字段计算“op_value”组的总价值。

想要的结果如下:

# "total" field stands for sum of "op_value", "op_code" value 1 is plus while 2 is minus.
{ "_id" : { "customer_id" : 1, "goods_id" : 10}, "total" : 2 } # 5 + 2 - 5

mongo 版本为:3.2.12

谢谢。

【问题讨论】:

  • 您必须使用聚合管道$group 阶段和$sum 运算符,如文档示例中所示:Calculate Count, Sum, and Average。您可以根据您的情况按多个字段分组。

标签: mongodb aggregation


【解决方案1】:

这正如你所料,

  db.items.aggregate(
    {
        $group: {
            _id: {
                "customer_id": "$customer_id",
                "goods_id": "$goods_id"
            },
            "pos": { 
               "$sum": { 
                   "$cond": [
                       { "$eq": [ "$op_code", 1 ] },
                       "$op_value",
                       0
                   ]
               }
            },
            "neg": { 
               "$sum": { 
                   "$cond": [
                       { "$eq": [ "$op_code", 2 ] },
                       "$op_value",
                       0
                   ]
               }
            }
        }
    },
    { "$project": {
       "_id": "$_id",
       "total": { "$subtract": [ "$pos", "$neg" ] }
    }})

【讨论】:

  • 感谢您的真诚回答,这确实有效。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多