必须用 new regexp('keyword', 'i') 构造正则,直接写 /keyword/i 在 h5 或小程序中可能报错或失效;多字段 or 查询需用 db.command.or 包裹多个单字段对象;字段类型、索引状态和运行环境三者需协同验证。

uniCloud.where 里怎么写正则才有效
直接写 /keyword/i 在某些环境(尤其是 H5)会报错或不生效,因为前端直连时部分正则语法被拦截或未被完整支持。真正可靠的方式是用 new RegExp() 构造,且必须传入字符串而非字面量。
-
where({ name: new RegExp('张', 'i') })✅ 安全、跨平台兼容 -
where({ name: /^张/i })❌ H5 可能报TypeError: Invalid regular expression -
where({ name: /张/i })❌ 小程序可能匹配失败,因底层序列化丢失标志 - 若 keyword 来自用户输入,务必用
RegExp.escape(需自行实现)转义特殊字符,否则keyword = 'a.b+c'会导致正则异常
多字段 or 模糊查怎么组合
想在 name 或 desc 里都搜关键词,不能靠多次 where 链式调用——那是 AND 关系。得用 db.command.or。
- 先引入指令:
const dbCmd = uniCloud.database().command - 写法:
.where(dbCmd.or([{ name: new RegExp(keyword, 'i') }, { desc: new RegExp(keyword, 'i') }])) - 注意:数组元素是对象,不是键值对;每个对象只能含一个字段,
{ name: ..., desc: ... }是无效的 - 如果字段是 text 类型且没建索引,
new RegExp查询可能超时,建议在 schema 中为该字段开启「全文索引」或改用云函数 + Elasticsearch 插件
云函数里查和前端直连查的区别
前端调 uniCloud.database().collection(...).where(...).get() 受限于前端权限策略;云函数里查则绕过这层限制,还能用聚合、事务等高级能力。
- 前端直连:必须提前在
schema.json中设"read": true,且仅支持基础查询,aggregate不可用 - 云函数查:不用管前端权限,
where写法一致,但推荐显式指定 provider:uniCloud.database({ provider: 'aliyun' }) - 性能差异:前端直连查大表易卡顿;云函数可加
.field()减少传输量,或用.limit(20)防止 OOM - 常见坑:
event.keyword在云函数里可能是 undefined,记得加默认值:const keyword = event.keyword || ''
为什么正则查不到数据但手动 copy 字符串却可以
大概率是字段内容带不可见字符(如 BOM、零宽空格、换行符),或数据库字段类型实际是 number / boolean 却当字符串查。
- 查前先确认字段类型:
db.collection('users').field({ name: true }).limit(1).get()看返回值类型 - 用
console.log(JSON.stringify(res.result.data[0].name))检查是否有隐藏字符 - 正则查
number字段会静默失败,得先转成字符串:where({ age: db.command.expr(db.command.toString('$age').match(new RegExp(keyword, 'i'))) }) - 大小写问题:中文无大小写,但英文字段若存的是
'Apple',而你查/apple/i,必须确保数据库字段确实存了小写——否则要统一存小写或查前做转换











