Firestore结合AngularFire实现displayName前缀LIKE查询异常求助
Firestore前缀匹配查询实现方案(AngularFire版)
嗨,我来帮你搞定这个Firestore前缀查询的问题!首先明确说:Firestore完全支持类似LIKE '前缀%'的前缀匹配查询,你之前的代码之所以返回几乎所有用户,是因为只设置了查询的起始点,没加结束边界~
问题根源
你当前的代码只用到了startAt(val),这会返回所有displayName大于等于val的文档,但没有上限,自然会拿到大部分数据。要实现“匹配前3个字符前缀”的需求,必须同时用startAt和endAt来圈定查询范围。
正确实现代码
结合你的AngularFire代码,修改后应该是这样:
// 先确保拿到用户输入的前3个字符(如果需要自动截取的话) const prefix = val.substring(0, 3); this.itemsCollection = this.aft.collection<iUser>('users', ref => ref.orderBy("displayName") .startAt(prefix) // 用Unicode末尾字符\uf8ff来限定上限,所有以prefix开头的字符串都会小于它 .endAt(prefix + '\uf8ff') );
代码说明
startAt(prefix):过滤出displayName大于等于前缀的文档endAt(prefix + '\uf8ff'):\uf8ff是Unicode中非常靠后的一个特殊字符,几乎所有常规字符串都会比它小,这样就能精准圈出所有以prefix开头的文档,完美实现你要的前缀匹配效果。
注意事项
- 记得在Firestore控制台给
displayName字段创建复合索引:当你第一次运行这个查询时,Firestore会在控制台抛出一个错误,里面包含创建索引的直接链接,点击就能一键创建,非常方便。 - 如果用户输入的内容不足3个字符,你可以根据需求处理:比如只在输入长度≥3时执行查询,或者按实际输入长度匹配前缀(把
substring(0,3)改成substring(0, val.length)即可)。 - 划重点:Firestore只支持前缀匹配,不支持中间或后缀的模糊查询(比如
%xxx%或%xxx),如果需要这类功能,得结合第三方全文搜索工具,不过那就是另一个话题啦~
内容的提问来源于stack exchange,提问作者Kravitz
相关产品推荐
相关产品推荐

