MongoDB多条件分组聚合查询

MongoDB多条件分组聚合查询

1、样例数据


{
    "_id" : ObjectId("5fa13fb76c3107345a82c047"),
    "_class" : "java.util.HashMap",
    "date" : "2020-11-03",
    "result" : "命中失败",
    "activityCode" : "TEST_CODE_123",
    "activityName" : "测试活动123",
    "channel" : "大唐"
}
{
    "_id" : ObjectId("5fa13fb76c3107345a82c049"),
    "_class" : "java.util.HashMap",
    "date" : "2020-11-03",
    "result" : "命中失败",
    "activityCode" : "TEST_CODE_456",
    "activityName" : "测试活动456",
    "channel" : "大汉"
}

{
    "_id" : ObjectId("5fa13fb76c3107345a82c050"),
    "_class" : "java.util.HashMap",
    "date" : "2020-11-03",
    "result" : "命中失败",
    "activityCode" : "TEST_CODE_456",
    "activityName" : "测试活动456",
    "channel" : "大秦"
}

2、需求分析

需要统计某一日期下不同活动不同渠道的调用量

3、统计SQL

db.collectionName.aggregate([{
    $match: {
        "date": "2020-11-03",
		"result": "命中失败"
    }
},
{
    $group: {
        _id: {
            activityCode: "$activityCode",
            channel: "$channel"
        },
        activityCode: {
            "$first": "$activityCode"
        },
        channel: {
            "$first": "$channel"
        },
        total: {
        $sum: 1
        }
    }
},
{
    $project: {
        _id: 0
    }
}])

4、SQL说明

#MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理
db.COLLECTION_NAME.aggregate({管道操作1},{管道操作2},...)

#这里其实就两个问题:如何多条件分组、如何展示各个分组条件的列
#多条件分组写法
{$group:{_id:{"别名1":"$分组字段1""别名2":"$分组字段2",····},total:{$sum:1}}}

#展示各个分组条件的列
#如果不经过处理直接查询会得到如下值:
{
  "_id" : {
    "activityCode" : "TEST_CODE_123",
    "channel" : "大唐"
  },
  "total" : 1
}
#这里activityCode、channel就会被包裹在_id里面,需要手工处理

#取出_id里分组字段对应的值写法
{ $group: { _id: { activityCode: "$activityCode", channel: "$channel" }, activityCode: { "$first": "$activityCode" }, channel: { "$first": "$channel" }, total: { $sum: 1 } } }
#说明:
   $first:根据资源文档的排序获取第一个文档数据  别名1:{"$first": "$分组字段1"}、别名2:{"$first": "$分组字段2"}
或者$last:根据资源文档的排序获取最后一个文档数据 别名1:{"$last": "$分组字段1"}、 别名2:{"$last": "$分组字段2"}
#得到结果
{
  "_id" : {
    "activityCode" : "TEST_CODE_123",
    "channel" : "大唐"
  },
  "activityCode" : "TEST_CODE_123",
  "channel" : "大唐",
  "total" : 1
}
#最后在 $project: { _id: 0} 配置_id隐藏输出,得到想要的结果:
{
  "activityCode" : "TEST_CODE_123",
  "channel" : "大唐",
  "total" : 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值