mongodb 复杂查询之 本表 join
mongdb 的数据介绍:
系统有多个用户,contractId 代表用户Id,其中 serialno 也是一种 id,代表该客户登录系统的编号,该 contractId 每次登录系统都会产生不同的 serialno,但同一次登录都会产生不同的数据,也就是如下数据会产生多条,stepCode 不一样, key 和value也不一样。stepCode最大时,也会有多条记录。
{
"_id": "5bf246ab51b7a735d7648224",
"serialno": "2018111100000001",
"create_time": 1542596328797,
"contractId": "F1011111111011111",
"createTime": "2018-11-11 11:11:11 111",
"id": 0,
"key": "APPINFO",
"loanChannel": "R000",
"stepCode": 11,
"value": {
"a_car_price": 0,
"a_car_price_change": 0,
"a_carloan_amount": 11000,
"a_com_fee": 1100,
"a_com_rate": 1111,
"a_init_payment": 1111,
"a_init_scale": 11.11,
"a_loan_amount": 11110,
"a_loan_periods": 11,
"a_loan_rate": 1.1,
"a_secure_fee": 100
},
"local_create_time": "2018-11-11T11:11:11.111+08:00"
}
查询目标说明
要求查询所有用户,每次登录系统时serialno,最后一次登录的状态,也就是的 stepcode最大时的多条记录。
方法技巧:
- 利用聚合Pipeline的多次筛选:$match 和 $project
- 利用 groupby + push + unwind,实现了本表的 join 操作
- 利用 unwind 解开了 push
- 利用 project 实现了增加状态位字段, 辅助复杂筛选条件的实现
- 利用 project 进行字段的筛选
- 最终合并同一个合同的数据结果
db.c_engine_col.aggregate( [ {"$match":{"local_create_time" : {"$gt":"2018-11-10", "$lt":"2018-11-20"}}}, // 筛选条件 { "$group":{"_id":"$serialno", "maxstep":{"$max":"$stepCode"}, "keys":{"$push":"$$ROOT"}} // 分组计算 maxstep, 并合并所有数据 }, {"$unwind":"$keys"}, // 解开数据 {"$project":{"_id":1, "maxstep":1, "keys.key":1, "keys.serialno":1, "keys.stepCode":1, "keys.value":1, "diff":{"$eq":["$maxstep","$keys.stepCode"]}}}, // 增加状态位 {"$match":{"diff":true}}, // 根据状态位筛选 stepcode==maxstep {"$project":{"_id":1,"keys.serialno":1 , "keys.key":1, "keys.stepCode":1, "keys.value":1}}, // 提取少量字段 { "$group":{"_id":"$keys.serialno", "key_value_arr":{"$push": "$$ROOT"} } // 并合并所有筛选后的数据 } ])
作者:
fandyst
出处: http://www.cnblogs.com/todototry/
关注语言: python、javascript(node.js)、objective-C、java、R、C++
兴趣点: 互联网、大数据技术、大数据IO瓶颈、col-oriented DB、Key-Value DB、数据挖掘、模式识别、deep learning、开发与成本管理
产品:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处: http://www.cnblogs.com/todototry/
关注语言: python、javascript(node.js)、objective-C、java、R、C++
兴趣点: 互联网、大数据技术、大数据IO瓶颈、col-oriented DB、Key-Value DB、数据挖掘、模式识别、deep learning、开发与成本管理
产品:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。