为什么Firestore的not-equal(!=)操作会被认定为范围过滤器
Firestore != 运算符的范围查询属性说明
- 首先可以明确:Firestore 中的
!=运算符确实是范围查询的语法糖,内部实现等价于组合where(x, <, y)与where(x, >, y)两个范围条件,合并两段范围的查询结果后返回。 - 它之所以不能和
==运算符一样兼容多字段组合查询,核心是索引机制的限制:==属于精确匹配,底层索引可以直接定位到对应值的存储位置,不需要扫描连续区间,因此可以和其他范围过滤器组合使用!=需要排除某一个特定值,无法通过索引精确定位,只能扫描小于目标值、大于目标值的两段连续索引区间,本质属于范围扫描,因此会被判定为范围过滤器
- 触发报错的原因很明确:当前查询已经对
location.geohash字段使用了范围过滤器(geohash 查询本质是前缀范围匹配,属于范围过滤),再对expire_at字段使用!=相当于新增了第二个范围过滤字段,触发了 Firestore「单条查询仅允许使用一个范围过滤器」的限制,同时也不符合「范围查询的字段必须与第一个orderBy字段一致」的要求。
内容的提问来源于stack exchange,提问作者Théo Champion
相关产品推荐
相关产品推荐

