MongoDB统计查询
$group基本操作:
- _id:分组字段的集合
- $sum:使用$+字段名为求和(字符串忽略);
- 1为每组的条数;
- 可以在$sum中多个字段进行运算,得出成为新字段的结果
- $addToSet:将分组内的某个字段加入一个集合中,无重复值,$push会重复
- $unwind:用于拆分数组,当addToSet后是一个集合,为了更直观显示可用此拆分
db.table_a.aggregate([{
$group:{
_id:{player_id:"$player_id", channel:"$channel"},
count : {"$sum": 1},
amount : {"$sum": "$amount"},
success: {"$sum": "$success"},
fail : {"$sum": "$fail"},
player_id: {"$addToSet": "$player_id"},
channel : {"$addToSet": "$channel"}
},{
$unwind:"$player_id"
},{
$unwind:"$channel"
}
])
Mgo操作
在golang中求和之后想在每一列中增加某些字段的值,所以要用上$push,$addToSet。但是用上这两个关键字后所得到的数据是个是个切片。为了更简单的与proto结构关联起来,所以要加上$unwind来拆分。注:我此时所要的附加字段是分组的字段,因此不会有重复求和的结果。
//go
findBson := bson.M{}
groupBson := bson.M{"_id": bson.M{"player_id": "$player_id", "channel": "$channel"},
"count": bson.M{"$sum": 1},
"amount": bson.M{"$sum": "$amount"},
"success": bson.M{"$sum": "$success"},
"fail": bson.M{"$sum": "$fail"},
"player_id": bson.M{"$addToSet": "$player_id"},
"channel": bson.M{"$addToSet": "$channel"},
}
//查询聚合数据条件
m := []bson.M{
{"$match": findBson},
{"$group": groupBson},
{"$unwind": "$PlayerId"},
{"$unwind": "$Channel"},
}
var data []*XXX // proto结构体
query = col.Pipe(m)
query.All(&data)
//proto
//用户注单统计数据
message XXX{
optional int64 player_id= 1;
optional string channel = 2;
optional int64 amount =3;
optional int64 success= 4;
optional int64 fail=5;
}