mongodb的聚合使用

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值