因为mysql的查询指令是字符串…所以可以动态拼接.例如.如果数组 a.length!=0 就添加条件,…等于0则不添加
云开发 数据库可以 动态拼接 查询指令吗?
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()