mongodb 如何聚合统计:根据字段A的类型(加减)来计算B的合值

问题描述

有以下数据结构:

{id:1, name: "apple", alias:"苹果", price: 5, type: "add"}
{id:1, name: "apple", alias:"苹果", price: 3, type: "minus"}
{id:1, name: "pear", alias:"梨子", price: 6, type: "add"}
{id:1, name: "pear", alias:"梨子", price: 3, type: "add"}
{id:1, name: "pear", alias:"梨子", price: 1, type: "minus"}

第一条数据是赚了5块钱(type为add),第二条是花了3块钱(type为minus), 等等。
我想要的结果是:

  1. 根据name分类
  2. 在1的分类基础下计算最终price的合值

合值根据type的类型确定,type为add时,price相加;type为munus时,price相减

比如上面的最终期望结果是:

[
    {name: "apple", price: 2},    //5-3
    {name: "pear", price: 8}      //6+3-1
]

如何用聚合统计来统计price的最终合并值呢,请教大神指点一下思路,谢谢

阅读 3k
1 个回答

有点疑问,为什么不直接存成{price: 5}, {price: -3}这样的形式?这样计算起来就简单多了,人看着也更明白一些。
以你现在的形式要做计算则需要写更复杂的pipeline:

db.foo.aggregate([{
    $project: {
        name: 1,
        price: {
            $cond: {
                if: {$eq: ["$type", "minus"]},
                then: {$subtract: [0, "$price"]},
                else: "$price"
            }
        }
    }
}, {
    $group: {
        _id: "$name",
        price: {$sum: "$price"}
    }
}])

如果按我说的存储方式:

db.foo.aggregate([{
    $group: {
        _id: "$name",
        price: {$sum: "$price"}
    }
}])

是不是简单很多?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题