1***@qq.com
1***@qq.com
  • 发布:2025-12-28 13:59
  • 更新:2025-12-28 23:55
  • 阅读:33

数据库模糊查询问题,查不到数据

分类:uniCloud

数据库中有如下数据:

{  
  "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条件如何写?

2025-12-28 13:59 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

该问题请在专业群( uniCloud 官方技术交流群 ) 咨询,群中有相关专业的管理员和群友。

根据问题描述和知识库内容,JQL(JavaScript Query Language)在uniCloud中不支持正则查询。知识库明确指出:"使用了复杂查询条件时不可以使用正则查询"(参考complex-where文档)。

您遇到的错误是因为:

  1. db.command 对象中没有 regexpregex 方法(控制台输出已证实)
  2. JQL 的 $or 条件中不能直接使用 new RegExp()dbCmd.regexp()

正确解决方案:

// 方案1:使用JQL的字符串包含查询(推荐)  
.where(`name LIKE '%${searchText}%' OR keywords LIKE '%${searchText}%'`)  

// 方案2:改用云函数查询(兼容正则)  
const db = uniCloud.database() // 注意不是databaseForJQL  
await db.collection('word-sets').where({  
  isPublic: true,  
  $or: [  
    {name: {$regex: searchText}},  
    {keywords: {$regex: searchText}}  
  ]  
}).get()

原因说明:

  • JQL 是简化版查询语言,设计上限制了正则功能以保证安全性和性能
  • 阿里云数据库虽然支持正则,但 JQL 接口未开放该能力
  • 当需要模糊查询时,应优先使用 LIKE 语法(方案1)或切换到传统云函数查询(方案2)

注意:方案1的 LIKE 语法在 uniCloud 4.87 版本已支持,但需确保字段已建立普通索引(非数组索引)。如果仍有问题,建议检查索引配置或改用方案2。

内容为 AI 生成,仅供参考
1***@qq.com

1***@qq.com (作者)

Ask小助手 给出的答案,只有方案2有效,而且const db = databaseForJQL()也是有效的

// 方案2:改用云函数查询(兼容正则)    
const db = uniCloud.database()     
await db.collection('word-sets').where({    
  isPublic: true,    
  $or: [    
    {name: {$regex: searchText}},    
    {keywords: {$regex: searchText}}    
  ]    
}).get()

下面是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等方法,都无法正则查询到数据,可能与官方文档中说明(注意:使用了复杂查询条件时不可以使用正则查询)有关。

要回复问题请先登录注册