unicloud 模糊查询解决方案
序
1、where和aggregate的模糊搜索
2、第一种是“你好”去匹配“你好啊大家”
3、第二种是“家啊”去匹配“啊!你家呢” 只要有1个字匹配就匹配
4、第三种是“家啊”去匹配“啊!你家呢” 必须有“家”又有“啊”才匹配”
想看效果,大家可以自己搜下
看效果
一、where的模糊搜索
1、第一种你好”去匹配“你好啊大家”
const db = uniCloud.database()const dbCmd = db.commandlet text=params.text;//用户文本输入的值let newSearch=await db.collection("news").where(dbCmd.or( {title:new RegExp(text, 'g')},{about:new RegExp(text, 'g')})).get()
new RegExp(params.text, 'g') 那个g的意思 ==》JavaScript RegExp 对象 | 菜鸟教程
然后 uni-app的官方文档只是提了下==》uni-app官网
如果你数据库的一条数据是 ↓↓↓↓↓↓
{name:"你在哪里呀",about:"你说呢,当然是去你家"
}
2、第二种“家啊”去匹配“啊!你家呢” 只要有1个字匹配就匹配
然后你想用户输入“你家去”想匹配到这条数据,那就得把用户输入的“你家”拆分成 “你”和“家”和“去”,然后变成new RegExp("你|家|去", 'g')
来看下面到代码↓↓↓↓
const db = uniCloud.database()const dbCmd = db.commandlet text=params.text;//用户文本输入的值text=text.split("").join("|") // 这个结果是 ==> "你|家|去|"let newSearch=await db.collection("news").where(dbCmd.or( //这个是“或”关系 相当于 => "if(a||b){}的||" 这个备注是给没后端基础的小伙伴看的{title:new RegExp(text, 'g')},{about:new RegExp(text, 'g')})).get()
3、第三种“家啊”去匹配“啊!你家呢” 必须有“家”又有“啊”才匹配”
如果是where就把match里面的直接放where里就可以了。没差的
const db = uniCloud.database()const dbCmd = db.commandlet text=params.text;//用户文本输入的值let titleRegArr=[]let aboutRegArr=[]text.split("").forEach((v,i)=>{titleRegArr.push({ //会变成这样 [{about: /家/gi},{about: /啊/gi}]title:new RegExp(v, 'ig')})aboutRegArr.push({about:new RegExp(v, 'ig')})})let newSearch=await db.collection("news").aggregate() .match(dbCmd.or( {title:dbCmd.and(titleRegArr)},{about:dbCmd.and(aboutRegArr)}))
二、聚合查询的过滤
let newSearch=await db.collection("news").aggregate().match(dbCmd.or( {title:new RegExp(text, 'g')},{about:new RegExp(text, 'g')})).end()