1.原始数据:
2.语句
(1)对字段进行分组求和,并显示字段(主要是把字段从ip中移出来,但是这种写法不提倡,因为多了一次$project管道,会降低性能)
db.im_play_data.aggregate(
{ "$match" : { "video_type" : 1}},
{ "$group" : { "_id" : { "source" : "$source" , "video_id" : "$video_id"} , "count" : { "$sum" : 1}}},
{ "$project" : { "count" : 1 , "video_type" : "$_id.video_type" , "video_id" : "$_id.video_id" , "source" : "$_id.source" , "ip" : "$_id.ip"}}
)
3.结果:
/* 0 */
{
"result" : [
{
"_id" : {
"source" : 2,
"video_id" : 443
},
"count" : 3,
"video_id" : 443,
"source" : 2
},
{
"_id" : {
"source" : 2,
"video_id" : 441
},
"count" : 2,
"video_id" : 441,
"source" : 2
},
{
"_id" : {
"source" : 1,
"video_id" : 421
},
"count" : 2,
"video_id" : 421,
"source" : 1
}
],
"ok" : 1
}
(2)利用分组对ip字段去重,顺便获取insert_time和account_id
db.im_play_data.aggregate(
{ "$match" : { "video_type" : 1 , "video_id" : 442 , "source" : 1}},
{ "$group" : { "_id" : "$ip",'insert_time':{$max:'$insert_time'},'account_id':{$first:'$account_id'}}}
)
结果:
/* 0 */
{
"result" : [
{
"_id" : "127.0.0.2",
"insert_time" : ISODate("2017-01-20T11:27:48.366+08:00"),
"account_id" : null
},
{
"_id" : "127.0.0.1",
"insert_time" : ISODate("2017-01-20T11:27:40.179+08:00"),
"account_id" : null
}
],
"ok" : 1
}
(3) 对2个字段分组,并对第三个字段(非整型字段,字符串字段)求和
//2次分组(第一次去重,第二次求和)
db.im_play_data.aggregate([
{ "$match" : { "video_type" : 1}},
{ "$group" : { "_id" : { "source" : "$source" , "video_id" : "$video_id","ip" : "$ip"}}},
{ "$project" : { "count" : 1 , "video_type" : "$_id.video_type" , "video_id" : "$_id.video_id" , "source" : "$_id.source" , "ip" : "$_id.ip"}},
{ "$group" : { "_id" : { "source" : "$source" , "video_id" : "$video_id"} , "count" : { "$sum" : 1}}}
])
结果:
/* 0 */
{
"result" : [
{
"_id" : {
"source" : 2,
"video_id" : 417
},
"count" : 1
},
{
"_id" : {
"source" : 1,
"video_id" : 423
},
"count" : 1
},
{
"_id" : {
"source" : 3,
"video_id" : 415
},
"count" : 1
},
{
"_id" : {
"source" : 2,
"video_id" : 443
},
"count" : 3
}
],
"ok" : 1
}