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到.
我不知道如何改进它.有帮助吗?
您需要$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)