Firebase Firestore使用where实现属性数值区间查询的问题咨询
问题原因
你使用in运算符不生效的根本原因:Firestore的in运算符是用来精确匹配字段值是否等于查询数组内的任意一个元素,你写的[14,15]只会返回data.value_a刚好等于14或者刚好等于15的文档,不会匹配14到15之间的数值,所以无法实现区间筛选需求。
需求实现方案
a) 筛选data.value_a在14到15区间的产品
直接用两个范围比较条件组合即可,代码如下:
firestore().collection('products') .where("data.value_a", ">=", 14) .where("data.value_a", "<=", 15)
注意:执行这个查询前需要先创建对应的复合索引,第一次执行失败时控制台会输出索引创建提示,按照提示创建等待生效即可。
b) 筛选同时满足data.value_a在14-15、data.value_b在2-5区间的产品
受Firestore查询规则限制:不支持直接在多个不同字段上同时使用范围过滤器,有两种可选实现方案:
方案1:先查首条件再客户端过滤(适合数据量小的场景)
先通过第一个范围查询拿到符合value_a条件的所有文档,再在代码里过滤value_b符合要求的条目:
// 先查符合value_a条件的文档 const snapshot = await firestore().collection('products') .where("data.value_a", ">=", 14) .where("data.value_a", "<=", 15) .get() // 客户端过滤value_b条件 const result = snapshot.docs.filter(doc => { const valueB = doc.data().data.value_b return valueB >= 2 && valueB <=5 })
方案2:冗余字段优化查询(适合数据量大的生产场景)
提前给文档新增一个用于匹配value_a区间的相等字段,比如data.value_a_tag,当value_a在14-15区间时该字段值固定为14_15,之后就可以配合value_b的范围查询直接命中:
firestore().collection('products') .where("data.value_a_tag", "==", "14_15") .where("data.value_b", ">=", 2) .where("data.value_b", "<=", 5)
这个方案符合Firestore复合查询规则(仅对一个字段用范围过滤器),查询效率更高。
内容的提问来源于stack exchange,提问作者rop lop fan
相关产品推荐
相关产品推荐

