微信小程序联表查询、跨时间段查询
发布于 5 年前 作者 plei 1836 次浏览 来自 分享

需求分析

注意:小程序端不支持 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

回到顶部