云开发 数据库可以 动态拼接 查询指令吗?
发布于 5 年前 作者 min75 6597 次浏览 来自 官方Issues

因为mysql的查询指令是字符串…所以可以动态拼接.例如.如果数组 a.length!=0 就添加条件,…等于0则不添加

云开发 数据库可以 动态拼接 查询指令吗?

3 回复

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/database/command.expr.html

var _ = db.command, $ = _.aggregate

var res = await db.collection(‘table2’).where(_.expr(

    // 聚合表达式写在这里

)).get()

下面举几个聚合表达式的栗子:

且条件 就用 $.and([   条件1表达式, 条件2表达式, …,   条件n表达式 ]),各表达式间是并且的关系

或条件 就用 $or([   条件1表达式, 条件2表达式, …,   条件n表达式 ]),各表达式间是或者的关系

// 比如 uid = 1

$.eq([’$uid’, 1])

// 比如 type = 1 并且 state > 2   => $.and([   条件1表达式, 条件2表达式   ])

$.and([  $.eq([’$type’, 1]), $.gt([’$state’, 2])  ])

// 比如 type = 1 并且 (state > 2 或者 num != 0)  

// $.and([   条件1表达式,  $.or([    条件2表达式, 条件3表达式    ])   ])

$.and([   $.eq([’$type’, 1]),   $.or([  $.eq([’$state’, 30]), $.neq([’$num’, 0])  ])    ])

// 比如 oid 在 [10,20,30] 中 并且 aid 不在 [100,200] 中

$.and([  $.in([’$oid’, [10, 20, 30]]), $.not($.in([ ‘$aid’, [100, 200] ]))  ])

你说到动态添加条件,也不是不可以

以where为例,where的基本结构是 function where(rule: object): Query

它的参数是一个json对象

所有你可以先构建这个json对象

var a = [], b = 0, // a,b可以是外部传入的数据,这里为了方便,写死

    wh = { uid: 1 } // 假设有个默认条件,uid=1

if (a.length <= 0) {

    wh.type = 1

}

if (b == 0) {

    wh.bind = ‘$aid’ // 这里条件bind等于记录里的aid的值

}

// 最终 wh = {uid:1,type:1,bind:’$aid’}

db.collection(…).where(wh).get()

// ========================================

where里使用_expr也一样可以动态添加条件,道理同上面所说的where思路一样

如:同上,默认条件为uid=1,当a.length <= 0时,多加type=1的条件

    b为0时,多加bind=aid字段值的条件

var ands = [$.eq([’$uid’, 1])]

if (a.length <= 0) {

    ands.push($.eq([’$type’, 1]))

}

if (b == 0) {

    ands.push($.eq([’$bind’, ‘$aid’]))

}

db.collection(…).where(_.expr(

    $.and(ands)

)).get()

大佬们帮帮我

查询条件一样可以动态生成的

回到顶部