MongoDB高级查询多级分组聚合及时间计算应用实践案例

Posted 肖永威

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB高级查询多级分组聚合及时间计算应用实践案例相关的知识,希望对你有一定的参考价值。

本文是Mongo DB复杂聚合查询实践案例,其中使用较多时间变换及时间计算,粗略整理出来分享学习。

1. 案例一:筛选并按月份聚合流失客户

需求描述:
取客户交易特征集中最后一次记录(条件为流失、日交易次数<=5),以此数据集为基准,按月统计交易额合计。其中,月份是指统计流失月份,也就是按CRM定义180天后所确认(“可以确定的”流失月份=当时最后一次交易+180天)。

Mongo聚合( aggregate)代码:
查询代码结构:

代码:

db.getCollection('customerchurnfeature').aggregate([
{ $match : {"occurtime":{"$gt" :"2020-07-01"} ,'lateststatus':3,'trans_sum':{'$lte':5}}},
{"$group":{'_id': "$carduser_id",occurtime:{"$max":"$occurtime"},data:{$first: '$$ROOT'}}},
{"$project":{'_id':0,'carduser_id':'$_id','amountmean':'$data.amountmean','occurtime':'$data.occurtime','yearmonth':  
    {$dateToString: { format: "%Y%m",date:{$add:[{ $dateFromString: { dateString: '$data.occurtime' } },180*24*60*60*1000]}}} }},
{"$group":{'_id': "$yearmonth", "amountsum":{"$sum":"$amountmean"},"churncount":{"$sum":1}}},
{"$sort":{"_id":1}}
], 
{
    allowDiskUse: true
})

结果效果:

2. 案例二:筛选转换构建开始时间并按此月份聚合新增客户

需求描述:
取客户交易特征集中最后一次记录(条件为不流失、日交易次数<=5),以此数据集为基准,按新增月份,统计月交易额合计。其中,原始开始时间存储为整型8位数据,需要转换为字符串,并分解字符串构建日期格式数据。

Mongo聚合( aggregate)代码:
查询代码结构:

db.getCollection('customerchurnfeature').aggregate([
{ $match : {"initdate":{"$gt" :20200910} ,'lateststatus':{'$ne':3},'trans_sum':{'$lte':5}}},
{'$project':{'begindate':{$toString:'$initdate'},'occurtime':'$occurtime','amountmean':'$amountmean','carduser_id':'$carduser_id'}},
{'$project':{'begindate':{$dateFromString:{dateString:{$concat:[{$substr:['$begindate',0,4]},'-',{$substr:['$begindate',4,2]},'-',{$substr:['$begindate',6,2]}]}}},
             'occurtime':'$occurtime','amountmean':'$amountmean','carduser_id':'$carduser_id'}},
{"$group":{'_id': "$carduser_id",occurtime:{"$max":"$occurtime"},data:{$first: '$$ROOT'}}},
{"$project":{'_id':0,'carduser_id':'$_id','amountmean':'$data.amountmean','occurtime':'$data.occurtime','yearmonth':  
    {$dateToString: { format: "%Y%m", date: '$data.begindate' }} }},
{"$group":{'_id': "$yearmonth", "amountsum":{"$sum":"$amountmean"},"newcount":{"$sum":1}}},
{"$sort":{"_id":1}}
], 
{
    allowDiskUse: true
})

结果效果:

3. 时间计算

3.1. 时间(天数)加减

计算时间加减(加180天):

db.getCollection('customerchurnfeature').find({},{'occurtime':1,'occurtime1':{$add:[{ $dateFromString: { dateString: '$occurtime' } },180*24*60*60*1000]}})

减法(10天):

db.getCollection('customerchurnfeature').find({},{'occurtime':1,'occurtime1':{$subtract:[{ $dateFromString: { dateString: '$occurtime' } },10*24*60*60*1000]}})

时间再转换为年月:

db.getCollection('customerchurnfeature').find({},{'occurtime':1,'yearmonth': {$dateToString: { format: "%Y%m",date:{$add:[{ $dateFromString: { dateString: '$occurtime' } },10*24*60*60*1000]}}}})

3.2. 数字转为时间

把数字转换为字符串,再转为时间:

db.getCollection('customerchurnfeature').aggregate( [ 
    {$match:{'carduser_id':1835714}},
        {$project:{'begindate':{$toString:'$initdate'}}},
        {$project:{'begindate':{$dateFromString:{dateString:{$concat:[{$substr:['$begindate',0,4]},'-',{$substr:['$begindate',4,2]},'-',{$substr:['$begindate',6,2]}]}}}}}
        ])

3.3. 时间区间查询

取时间段内数据:

db.getCollection('customerfeature').find({'occurtime':{'$gt':'2021-05-31','$lte':'2021-06-30'}})

以上是关于MongoDB高级查询多级分组聚合及时间计算应用实践案例的主要内容,如果未能解决你的问题,请参考以下文章

mongodb的基本增删改查与高级查询指令及聚合命令

MongoDB按聚合查询分组

mongodb 高级查询详解

Mongodb 高级

mongoDB表与表的关系及聚合管道查询

SQL语句汇总——聚合函数分组子查询及组合查询