需求分析
注意:小程序端不支持 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 包,你可以替换成自己获取请求参数的方法。
let matched = true; // 默认添加项
if (startTime && endTime) {
// 这里要将小程序端请求的date类型再new date一下。
startTime = new Date(startTime);
endTime = new Date(endTime);
/** 时间转码(必需) */
let startTimeJson = $.dateFromString({
dateString: startTime.toJSON()
});
/** 时间转码(必须) */
let endTimeJson = $.dateFromString({
dateString: endTime.toJSON()
});
matched = $.and([$.gte(['$due', startTimeJson]), $.lte(['$due', endTimeJson])]);
}
ctx.body = await cloud.database().collection('xxx')
.aggregate()
.lookup({
from: 'billTag',
localField: 'tagId',
foreignField: '_id',
as: 'tag',
})
.addFields({
matched
})
.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
请问lookup 加上了.skip().limt(),报错:db.collection(...).aggregate(...).match(...).lookup(...).sort(...).skip(...).limt is not a function,
这是怎么回事呢?
云函数代码:
小程序报错: