数据库中有如下数据:
{
"isPublic": true,
"name": "批量",
"keywords": "批量",
"words": [
{
"english": "i",
"chinese": "我"
},
{
"english": "you",
"chinese": "你"
}
],
"createTime": 1766753725631,
"creator": "683c24a3816a3feaeac8e338"
}
查询方法:
const db = uniCloud.databaseForJQL({
clientInfo: this.getClientInfo()
})
const res = await db.collection('word-sets') .where({
isPublic: true,
$or: [ {name: new RegExp(searchText)},
{keywords: new RegExp(searchText)}
] })
.skip((page - 1) * pageSize)
.limit(pageSize)
.get()
return res
以上面方法,请求参数为{"searchText":"批量"},查不到数据,不写 $or: [ {name: new RegExp(searchText)}, {keywords: new RegExp(searchText),只写 isPublic: true,可以查到数据,或者直接写成.where({ :isPublic: true, $or: [ {name: "批量"}, {keywords: "批量"} ])},也可以查到数据,
改为下面代码:
const db = uniCloud.databaseForJQL({
clientInfo: this.getClientInfo(),
provider: 'aliyun|tencent'
})
const dbCmd = db.command
const res = await db.collection('word-sets')
.where({
isPublic: true,
$or: [
{name: dbCmd.regexp(new RegExp(searchText))},
{keywords: dbCmd.regexp(new RegExp(searchText))}
]
})
.skip((page - 1) * pageSize)
.limit(pageSize)
.get()
return res
会报错,db.command.regex(),db.command.regexp(),都提示is not a function
console.log(Object.keys(db.command))结果为["content", "prevStage", "udb", "_database", "then", "_internalType", "inspect", "ob", "__v_raw"]
数据库设置name、keywords为不唯一索引,也是查不到
用的是阿里云数据库
请问正确where条件如何写?
2 个回复
Ask小助手
根据问题描述和知识库内容,JQL(JavaScript Query Language)在uniCloud中不支持正则查询。知识库明确指出:"使用了复杂查询条件时不可以使用正则查询"(参考complex-where文档)。
您遇到的错误是因为:
db.command对象中没有regexp或regex方法(控制台输出已证实)$or条件中不能直接使用new RegExp()或dbCmd.regexp()正确解决方案:
原因说明:
LIKE语法(方案1)或切换到传统云函数查询(方案2)注意:方案1的
LIKE语法在 uniCloud 4.87 版本已支持,但需确保字段已建立普通索引(非数组索引)。如果仍有问题,建议检查索引配置或改用方案2。1***@qq.com (作者)
Ask小助手 给出的答案,只有方案2有效,而且const db = databaseForJQL()也是有效的
下面是uni-app的ai给出的针对$regex的说明:
一、使用$regex进行模糊查询是uniCloud支持的查询方式,特别是在需要同时匹配多个字段时。
总结建议:
1、这是正确的查询语法,可以同时查询isPublic为true且name或keywords字段包含searchText的记录
2、注意$regex默认是区分大小写的,如需不区分大小写,可以使用{name: {$regex: searchText, $options: 'i'}}
二、目前uniCloud官方文档中没有专门章节详细介绍$regex操作符。但在实际查询中,$regex是支持的正则表达式查询语法,它的使用方式与MongoDB的语法类似。
几点说明:
$regex适用于字符串字段的模糊匹配查询
基本语法:{字段: {$regex: '匹配模式'}}
可以通过$options添加标志,如i(不区分大小写)
自总结:经过多次测试,new db.RegExp、name.indexOf('${searchText}') != -1、new RegExp、{name: eval(
/${searchValue}/i)}、db.RegExp等方法,都无法正则查询到数据,可能与官方文档中说明(注意:使用了复杂查询条件时不可以使用正则查询)有关。要回复问题请先登录或注册
公告
更多>相关问题