PouchDB query查询如何实现key的类似SQL LIKE的模糊匹配
问题原因
你当前的写法不生效是因为pouch.query()是用于查询MapReduce视图的API,它的key/keys参数仅支持精确匹配,不接受$regex这类Mango查询运算符,$regex是pouch.find()方法专属的查询语法。
实现方案
方案1:前缀匹配用startkey+endkey(性能最优,推荐)
如果你的匹配场景是固定前缀的部分匹配(也就是示例中hashFirst-开头的所有键),直接用范围查询即可,这是PouchDB/CouchDB体系下实现类LIKE 'prefix%'需求的标准方案,性能远高于正则匹配。
直接查询文档_id无需额外视图
不需要创建自定义视图,直接用allDocs接口即可:
const hashFirst = hashFn(first); const res = await pouch.allDocs({ startkey: `${hashFirst}-`, endkey: `${hashFirst}-\ufff0`, // \ufff0是Unicode高位字符,可匹配所有此前缀开头的字符串 include_docs: true // 不需要返回完整文档可移除该参数 }); // 匹配到的文档存储在res.rows的doc字段中
在自定义视图中做前缀匹配
将原有query参数修改为范围查询即可:
await pouch.query('my_doc/my_query', { startkey: `${hashFirst}-`, endkey: `${hashFirst}-\ufff0` })
方案2:使用pouch.find()的$regex实现任意模糊匹配
如果你的匹配逻辑不是前缀匹配,需要更灵活的正则规则,可以使用Mango查询的$regex语法,数据量较大时建议提前给对应字段创建索引提升查询性能:
const res = await pouch.find({ selector: { _id: { $regex: `^${hashFirst}-.*` // 加^锚定前缀可提升性能,无锚定的全模糊匹配性能较低 } } }); // 匹配结果存储在res.docs中
内容的提问来源于stack exchange,提问作者MLProgrammer-CiM
相关产品推荐
相关产品推荐

