收藏
回答

如何将数据库查询条件封装成参数传递给云函数?

云函数端查询语句:

    db.collection(collectionName).where(wherex).get()

这里wherex是前端传过来的参数

当需要用到db.command时应如何处理参数wherex


回答关注问题邀请回答
收藏

5 个回答

  • gai
    gai
    2021-10-05

    我的处理方案供大家参考,

    主要的思路是在云函数中重新将上传的参数解析成为命令查询,我仅写了简单的查询命令解析,对于带逻辑关系的因没有用到,所以没有写,这里提供一个思路:

    本地和云函数的代码如下:

    // 本地的查询条件
    let condition ={
         endDate:{
              command:"gte",
              value:Date.now()
            },
          _startDate:{
                command:"gte",
                value:startDate //startDate这是一个变量
            }
        }
    
    // 云端函数中的查询条件处理如下
    let condition = event.condition
    let collectionname = event.collectionname
    //定义云函数的查询对象
    let newcontion ={}
    //解析本地查询条件的函数
    let getcommand = (key,item) => {        
          switch(item.command){
            case "no":
              newcontion[key] =item.value
              break;
            case "gte":
              newcontion[key] = _.gte(item.value)
              break;
            case "eq":
              newcontion[key]= _.eq(item.value)
              break;
            case "lt":
              newcontion[key] = _.lt(item.value)
              break;
            case "gt":
              newcontion[key] = _.gt(item.value)
              break;
            case "in":
              newcontion[key] = _.in(item.value)
              break;
            case "nin":
              newcontion[key] = _.nin(item.value)
              break;
            case "neq":
              newcontion[key] = _.neq(item.value)
              break;
          }     
        };
    
    
        // 解析传递过来的condition中的每个查询对象
        for (let key in condition) {
            getcommand(key,condition[key])
        }
        //查询语句
        const countResult = await db.collection(collectionname).where(newcontion).count()
    
    2021-10-05
    有用
    回复
  • Admin ²º²³
    Admin ²º²³
    2020-05-13

    谢邀:

    个人觉得楼主需要自定义一个参数结构

    wherex:{
    
    whereString:{
    
    //这里写正常where
    
    },
    
    command:{//这里写command,
    
    _or:["A=b","C=D"
    
    _and:[xxx,xxx]
    
    }
    
    2020-05-13
    有用
    回复 1
    • JAVA不吃辣椒
      JAVA不吃辣椒
      2020-06-01
      command:{//这里写command,
      _or:["A=b","C=D"
      _and:[xxx,xxx]
      }


      _or是对应云函数中的_.or吗?
      2020-06-01
      回复
  • 用户小白兔
    用户小白兔
    2020-05-13

    请问这个问题现在解决了吗,还是需要分成很多函数吗

    2020-05-13
    有用
    回复
  • Mr.zhu
    Mr.zhu
    2020-03-17

    我也想这么操作,请问你弄出来了吗?

    我在本地这样是可以的,可以将条件封装,但是移到云函数,这样直接whereparams的写法就会说参数不对。

    function updateRecord(tablename, whereparams, dataparams) {

    db.collection(tablename).where(

    whereparams

    )

    .update({

    data: dataparams,

    success: res => {

    return true;

    },

    fail: err => {

    return false;

    }

    })


    2020-03-17
    有用
    回复 1
    • JAVA不吃辣椒
      JAVA不吃辣椒
      2020-03-19
      没解决,只能分成好多函数。
      2020-03-19
      回复
  • 就在那里
    就在那里
    2020-01-21

    不知道你想问啥,db.command和传过来的参数又没有关系

    2020-01-21
    有用
    回复 7
    • JAVA不吃辣椒
      JAVA不吃辣椒
      2020-01-21
      比如想查username不为‘admin’的记录
      在云函数端要写成:
            const wherec = {username: db.command.neq('admin')}
            let res = await db.collection(event.data.collectionName).where(wherec).get()
      这里wherec我不想在云函数端写死,而希望在小程序端以参数形式传给云函数。
      在查询的时候db.command总是要作用于where的条件,二者有很大的关系。
      事实上,db.command应该是参数的一部分
      2020-01-21
      回复
    • 就在那里
      就在那里
      2020-01-21回复JAVA不吃辣椒
      你可以先把云函数定义好,然后前端通过传递不同的参数来触发不同的云函数操作,比如前端传递neq属性过来,云函数就拼接wherec=username:db.command.neq('admin)进行请求数据。甚至可以username,neq,admin三个一起传递给云函数,然后云函数拼接wherec=username:db.command.neq('admin)
      2020-01-21
      回复
    • JAVA不吃辣椒
      JAVA不吃辣椒
      2020-01-22回复就在那里
      有没有办法把拼接的过程放在小程序端完成,云函数只接收wherec一个参数,也就是说:
      在云函数端只用一条查询语句(只接收wherec一个参数,不用再对参数进行分支判断),通过改变参数的方法(或者其它方法),适配所有前端传过来的查询。
      2020-01-22
      回复
    • 就在那里
      就在那里
      2020-01-22回复JAVA不吃辣椒
      你是想写一个通用的云函数吗?你说的这种做法我没试过,不知道可不可行
      2020-01-22
      回复
    • JAVA不吃辣椒
      JAVA不吃辣椒
      2020-01-22回复就在那里
      对,想让云函数代码量最少,业务逻辑代码,查询条件组装,都写在小程序端
      2020-01-22
      回复
    查看更多(2)
登录 后发表内容
问题标签