【笔记】云开发聚合实现跨表查询、计算逻辑、判断权限
背景:
之前不会用聚合,因为数据库结构分为了用户表、帖子表、喜欢表。> 小程序端请求一次列表,要根据帖子列表,循环查询用户表,喜欢表,并且还要做一系列的逻辑处理,计算当前帖子的权限、是否喜欢过、管理权限等信息。
效果:
之前: 上百行代码,多次查询,需要单独判断函数,处理时间在3000ms以上
之后:一行代码,一次查询,直接查询时算出权限,处理时间在300ms以内
数据库结构
代码实现:
let query = [{
//0我的
'_openid': OPENID
},
{
//1公开
public: true
},
{
//2喜欢
likes: db.command.all([OPENID])
// likes: $.in([OPENID, '$likes'])
},
{
//3本周
createTime: $.gte(['$createTime', getCurDate('weekStart')])
// createTime: _.gte(getCurDate('weekStart'))
}, {
//4帖子
_id: event.id
}
]
//判断查询条件
let listData = await db.collection('post').aggregate()
.match(query[event.listType])
.sort({
createTime: -1
})
.skip(20 * (event.pageNum - 1))
.limit(20)
.lookup({
from: "user",
localField: "_openid",
foreignField: "_id",
as: "postList"
})//和用户表关联
.replaceRoot({
newRoot: $.mergeObjects([$.arrayElemAt(['$postList', 0]), '$$ROOT'])
})//将用户表信息放到根节点上
.addFields({
day: $.dayOfMonth('$createTime'),
month: $.month('$createTime'),
year: $.year('$createTime'),
time: $.dateToString({
date: '$createTime',
format: '%Y年%m月%d日'
}),
isLike: $.in([OPENID, '$likes']), //判断这个帖子是否喜欢
isLiked: $.in([OPENID, '$liked']), //判断这个帖子是否喜欢过
isAuthor: $.eq(['$_openid', OPENID]), //判断这个帖子是否为作者
isAdmin: $.eq([OPENID, 'oy0T-4yk7lCRFGDefpFC4Yvx_ppU']),//判断是否有管理员权限
like: $.size('$likes'), //喜欢数
})
.project({
postList: 0,
userInfo: 0,
liked: 0,
likes: 0,
city: 0,
province: 0,
country: 0,
language: 0,
nlp: 0,
saveType: 0,
})//清除掉不需要的字段
.end()