微信小程序——聚合Aggregate操作实例中match,无法按照Date时间查询

背景

  • 使用Date类型字段作为筛选条件时,在单表操作中很简单,使用where条件查询即可,但是在多表聚合操作中,使用match匹配Date类型字段就会报错,报错如下
    2019-11-01T03:15:08.890Z  { Error: errCode: -501007 invalid parameters | errMsg: [InvalidParameter] Check request parameter fail. Please check your request, but if the problem cannot be solved, contact us.;
    at new CloudSDKError (/var/user/node_modules/wx-server-sdk/index.js:6389:28)
    at Object.returnAsCloudSDKError (/var/user/node_modules/wx-server-sdk/index.js:6441:16)
    at Object.checkError (/var/user/node_modules/wx-server-sdk/index.js:1672:23)
    at Aggregate.<anonymous> (/var/user/node_modules/wx-server-sdk/index.js:1351:41)
    at step (/var/user/node_modules/tslib/tslib.js:136:27)
    at Object.next (/var/user/node_modules/tslib/tslib.js:117:57)
    at fulfilled (/var/user/node_modules/tslib/tslib.js:107:62)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
    errCode: -501007,
    errMsg: '[InvalidParameter] Check request parameter fail. Please check your request, but if the problem cannot be solved, contact us.; ' }
  • Next

原因

  • 无效参数,match匹配字段为date类型时,不能直接与new Date的对象进行比较

解决方法

  • 代码如下
    // 云函数入口文件:查询报表数据
    const cloud = require('wx-server-sdk')
    
    cloud.init()
    const db = cloud.database();
    
    
    // 云函数入口函数
    exports.main = async (event, context) => {
      const pageSize=event.pageSize;//每页数量
      const currentPage=event.currentPage;//当前页
      var startDate=event.startDate;//查询条件:开始日期
      var endDate=event.endDate;//查询条件:结束日期
      var $ = db.command.aggregate;
    
      var matchQueryObj=true;
    
      if('' != startDate && '' != endDate){
        var queryStartDate = $.dateFromString({
          dateString: new Date(startDate).toJSON()
        });
        var queryEndDate = $.dateFromString({
          dateString: new Date(endDate).toJSON()
        });
        matchQueryObj=$.and([$.gte(['$gostorage_time', queryStartDate]),$.lte(['$gostorage_time', queryEndDate])]);
    
      }else if('' != startDate && '' == endDate){
        var queryStartDate = $.dateFromString({
          dateString: new Date(startDate).toJSON()
        });
        matchQueryObj=$.gte(['$gostorage_time', queryStartDate]);
      }else if('' == startDate && '' != endDate){
        var queryEndDate = $.dateFromString({
          dateString: new Date(endDate).toJSON()
        });
        matchQueryObj=$.lte(['$gostorage_time', queryEndDate]);
      }
     
      return await db.collection('t_gostorage')
              .aggregate()
              .lookup({
                from: "t_goods",
                localField: "goods_id",
                foreignField: "_id",
                as: "goodsList"
              })
              .replaceRoot({
                newRoot: $.mergeObjects([ $.arrayElemAt(['$goodsList', 0]), '$$ROOT' ])
              })
              .addFields({
                matched: matchQueryObj
              })
              .match({
                matched: true
              })
              .project({
                goodsList: 0
              })
              .skip(pageSize*(currentPage-1))
              .limit(10)
              .end()
              .then(res =>{
                return res;
              } )
              .catch(err => {
                console.error(err)
              })
    
    }
  • 原理
    • addFields:在查询结果中添加一个matched的字段,字段的值为matchQueryObj的结果,值为true或者false
    • match:查找匹配结果matched=true的结果
    • 其中matchQueryObj就是时间过滤的内容,返回结果为true或者false
  • 代码注解
    • startDate和endDate是前台传过来的时间参数,分别为开始时间和结束时间
    • 根据startDate和endDate是否为空组合查询条件,得到matchQueryObj
    • addFields:在查询结果中添加一个matched的字段,字段的值为matchQueryObj的结果
    • match:查找匹配结果matched=true的结果,此集合就是经过时间过滤的数据
  • Next