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高级查询多级分组聚合及时间计算应用实践案例的主要内容,如果未能解决你的问题,请参考以下文章