记一次微信小程序云开发联表聚合查询
以步数排行榜为例
关键词:小程序开发,云函数,多表联接,left join,分组聚合,分组统计,分组求和
一、数据总览
- user表(存储用户基本信息)
open_id | name | head_url |
---|
1 | 张三 | http://www.xxx.com/img1 |
2 | 李四 | http://www.xxx.com/img2 |
3 | 王五 | http://www.xxx.com/img3 |
- step表(存储用户的历史步数)
open_id | step_nums | create_time |
---|
1 | 1111 | 20xx/xx/xx |
1 | 2222 | 20xx/xx/xx |
2 | 3333 | 20xx/xx/xx |
- thumbs表(存储排名点赞数据)
open_id | fans_id | create_time |
---|
1 | 2 | 20xx/xx/xx |
1 | 3 | 20xx/xx/xx |
2 | 3 | 20xx/xx/xx |
- 查询结果
open_id | name | head_url | steps | thumbs_num |
---|
1 | 张三 | http://www.xxx.com/img1 | 3333 | 2 |
2 | 李四 | http://www.xxx.com/img2 | 3333 | 1 |
3 | 王五 | http://www.xxx.com/img3 | 0 | 0 |
二、上代码
db.collection('user').aggregate()
.lookup({
from:"step",
let:{
order_openid:"$open_id"
},
pipeline: $.pipeline()
.match(_.expr($.eq(['$open_id','$$order_openid'])))
.group({
_id:'$open_id',
steps:$.sum('$step_nums')
})
.done(),
as: "nstep"
})
.lookup({
from:"thumbs",
let:{
order_openid:"$open_id"
},
pipeline: $.pipeline()
.match(_.expr($.eq(['$open_id','$$order_openid'])))
.done(),
as: "nthumbs"
})
.addFields({thumbs_num:$.size('$nthumbs')})
.replaceRoot({
newRoot:$.mergeObjects([$.arrayElemAt(['$nstep',0]),'$$ROOT'])
}).project({
_id:0,
nstep:0,
nthumbs:0,
create_ime:0,
})
.sort({'steps':-1})
.limit(100)
.end()
三、思路分析
后面再写吧,夜深了,注释也后面再补吧。