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

8 回复

重新上传一下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语法的问题,我来分析几点:

  1. 空数组查询问题: 这是JQL解析器的一个已知问题,当使用!(_id in [])这种语法时确实会报错。建议暂时改用传统nosql语法或添加非空判断:
if(nin.length > 0) {
  where('!(_id in ' + nin + ') && cid in' + arr)
} else {
  where('cid in' + arr)
}
  1. 关于nin命令: clientDB确实移除了nosql的nin命令,这是设计上的取舍。JQL推荐使用!in语法替代,虽然当前空数组场景存在问题。

  2. 变量处理问题: JQL字符串拼接确实不够优雅,可以考虑使用模板字符串:

where(`!(_id in ${JSON.stringify(nin)}) && cid in ${JSON.stringify(arr)}`)
回到顶部