微信小程序联表查询、跨时间段查询
需求分析
注意:小程序端不支持 lookup,所以我们退而求其次,交由云开发端实现这一功能。
- 联表查询
- 时间段匹配
- 分页
代码
闲言碎语不要讲咱们直接上干货:
/** 函数前一定要写上 async */
/**
* 请求参数
* @param {Date} startTime 查询开始时间
* @param {Date} endTime 查询结束时间
* @param {Number} limit 每页条目
* @param {Number} offset 页码
*/
let { startTime, endTime, limit = 20, offset = 1 } = ctx._req.event; // 这个我使用了 tcb-router 包,你可以替换成自己获取请求参数的方法。
// 这里要将小程序端请求的date类型再new date一下。
startTime = new Date(startTime);
endTime = new Date(endTime);
/** 时间转码(必需) */
let startTimeJson = $.dateFromString({
dateString: startTime.toJSON()
});
/** 时间转码(必须) */
let endTimeJson = $.dateFromString({
dateString: endTime.toJSON()
});
ctx.body = await cloud.database().collection('xxx')
.aggregate()
.lookup({
from: 'billTag',
localField: 'tagId',
foreignField: '_id',
as: 'tag',
})
.addFields({
matched: $.and([$.gte(['$due', startTimeJson]), $.lte(['$due', endTimeJson])])
})
.match({
matched: true
})
.sort({
due: -1,
createTime: -1
})
.skip(offset * limit)
.limit(limit)
.end()
.then(res => {
log.log({
state: 'success',
...res
});
return res;
})
.catch(err => {
log.error({
state: 'error',
...err
});
return err;
});
缺陷和不足
- 如果小程序端没有传开始时间或者没传结束时间,会出现什么结果?
参考链接
[1] 如何使用数据库聚合match过滤$.and? - 微信开放社区 https://developers.weixin.qq.com/community/develop/doc/000860ca140fd87ab5e8bd7075b400
[2] 云开发 聚合阶段 match无法根据时间查询? - 微信开放社区 https://developers.weixin.qq.com/community/develop/doc/000caa1ef70b98d59869e25c454400