uni-app JQL 语法bug及一些问题
uni-app JQL 语法bug及一些问题
示例代码:
let nin = JSON.stringify(this.services.map(it => it._id))
let arr = JSON.stringify(this.ids)
db.collection('services')
.where('!(_id in ' + nin + ') && cid in' + arr)
.get()
操作步骤:
- where(’!(_id in ’ + nin + ‘) && cid in’ + arr) 且nin为空数组 []
预期结果:
预期结果应当与传统的nosql语法输出一致。
where({
_id: cmd.nin([]),
cid: cmd.in(['foo'])
})
实际结果:
报错:Cannot read property ‘simplify’ of null
bug描述:
where查询里面的jql语法, 当非!查询条件右边为数组且为空时,不能与 &&一起使用,报Cannot read property ‘simplify’ of null ,详见代码示例。
这种符合逻辑的查询条件,在nosql语法里面是不存在问题。 其他的几个问题: 一、clientDB把nosql语法的command 的 nin砍掉是啥意思,jql非不能用,nosql的nin又没有,无奈~~ 二、就jql来说,当where里面的右边为变量时(而且通常都是变量,谁又会使用字面量查询呢,尽管你们的示例代码看起来非常美好),复杂度不比nosql的语法低,如贴的代码,查询条件是数组,需要转string再拼接,且${val} 语法无法用在数组上。String类型,套上${val},然后再加双引号,这种怪异的语法,不是应当封装在语法解析器里面么,逼用户写前端维护起来,还不如传统的nosql。 三、更新字段命令如inc,remove不能使用,又被逼回云函数了。 四、jql出发点不错,但很多细节还需要优化,语法规范,建议还是尽量不要偏离了基本标准和传统习惯。
更多关于uni-app JQL 语法bug及一些问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
重新上传一下schema,in的问题已修复。其他问题我们也关注一下
更多关于uni-app JQL 语法bug及一些问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
感谢
nosql 的command.nin回来了,测试没有问题可以使用了。 但JQL的where(’!(name in [“name1”]) && status == false’) 这样的语法还是会报错,无法通过解析。 不加与&&单独非!的where(!(status in [‘a’,‘b’]),虽然不报错,但没有返回数据。
cmd.nin([]), not in 空数组会报错,按照语义翻译,没有在这数组里面的,都应当返回,这并没有什么问题,而且云函数nosql这个是可以通过的,clientDB,通过不了。报右侧类型值不正确的错误。估计是jql解析语句的时候,遇到nin操作符,会判断右侧数组的length,length为零则报错。
回复 名图客: 你把你的数据和查询用的代码以及schema打包发我一下,我这测试都是正常的
另外确定一下是不是连接的本地云函数进行测试的
回复 DCloud_uniCloud_WYQ: 是本地,切换为云端没问题了,抱歉,感谢。
关于uni-app JQL语法的问题,我来分析几点:
- 空数组查询问题:
这是JQL解析器的一个已知问题,当使用
!(_id in [])
这种语法时确实会报错。建议暂时改用传统nosql语法或添加非空判断:
if(nin.length > 0) {
where('!(_id in ' + nin + ') && cid in' + arr)
} else {
where('cid in' + arr)
}
-
关于nin命令: clientDB确实移除了nosql的nin命令,这是设计上的取舍。JQL推荐使用
!in
语法替代,虽然当前空数组场景存在问题。 -
变量处理问题: JQL字符串拼接确实不够优雅,可以考虑使用模板字符串:
where(`!(_id in ${JSON.stringify(nin)}) && cid in ${JSON.stringify(arr)}`)