基于某些条件的两个字段的总和

时间:2016-05-22 08:16:09

标签: mongodb mongodb-query aggregation-framework

这些是我在Stat集合中的文件:

{placeid: 'plaza', guestid: "xxx", logtype: "purchase", value: 12}
{placeid: 'plaza', guestid: "xxx", logtype: "visit", value: 0}
{placeid: 'plaza', guestid: "xxx", logtype: "purchase", value: 17}
{placeid: 'plaza', guestid: "yyy", logtype: "visit", value: 0}  

我想聚合这些文档来获取信息(传递plaza作为参数):

  • xxx访问过:1,购买:2,购买价值为29
  • yyy访问过:1,购买:0,购买价值为0

这是我的方法:

Stat.aggregate(
        [
            { $match: { placeid: "plaza" } },
            {
                $group: {
                    _id: "$guestid",
                    totallogs: { $sum: 1 },
                    totalvalue: { $sum: "$value" },
                }
            }
        ]
)  

问题在于此聚合不考虑logtype

我不知道如何改进它。有帮助吗?

1 个答案:

答案 0 :(得分:5)

你需要使用聚合框架来$group你的文件" guestid"并使用$sum累加器运算符返回总和。当然,您还需要$cond运算符来计算" logtype"的值。并返回" true case"的值。

db.Stat.aggregate([
    { "$match": { "placeid": "plaza" } },
    { "$group": { 
        "_id": "$guestid", 
        "visit": { 
            "$sum": { 
                "$cond": [ 
                    { "$eq": [ "$logtype", "visit" ] }, 
                    1, 
                    0 
                ] 
            } 
         }, 
         "purchases": { 
             "$sum": { 
                  "$cond": [ 
                      { "$eq": [ "$logtype", "purchase" ] }, 
                      1, 
                      0 
                  ] 
             } 
        }, 
        "value_purchase": { 
            "$sum": {
                "$cond": [ 
                    { "$eq": [ "$logtype",   "purchase" ] },
                    "$value", 
                    0 
                ]  
            } 
        }  
    }}
])

产生:

{ "_id" : "yyy", "visit" : 1, "purchases" : 0, "value_purchase" : 0 }
{ "_id" : "xxx", "visit" : 1, "purchases" : 2, "value_purchase" : 29 }