评论

微信小程序联表查询、跨时间段查询

云开发端使用aggregate下的lookup联表查询。

需求分析

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

最后一次编辑于  2020-07-02  
点赞 5
收藏
评论

1 个评论

  • 心野
    心野
    2020-04-06

    请问lookup 加上了.skip().limt(),报错:db.collection(...).aggregate(...).match(...).lookup(...).sort(...).skip(...).limt is not a function,

    这是怎么回事呢?

    云函数代码:

    小程序报错:

    2020-04-06
    赞同
    回复 1
    • 神经蛙
      神经蛙
      2020-07-02
      limt => limit
      2020-07-02
      回复
登录 后发表内容