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

Jac*_*cik 3 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}  
Run Code Online (Sandbox Code Playgroud)

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

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

这是我的方法:

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

这里的问题是这个聚合没有考虑logtype到.

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

sty*_*ane 5

您需要$group通过"guestid" 将聚合框架用于文档,并使用$sumaccumulator运算符返回总和.当然,您还需要$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 
                ]  
            } 
        }  
    }}
])
Run Code Online (Sandbox Code Playgroud)

产生:

{ "_id" : "yyy", "visit" : 1, "purchases" : 0, "value_purchase" : 0 }
{ "_id" : "xxx", "visit" : 1, "purchases" : 2, "value_purchase" : 29 }
Run Code Online (Sandbox Code Playgroud)