Firestore复合查询如何实现国家与城市双字段OR匹配的文档筛选
Firestore 多条件组合查询方案
你的需求对应的逻辑表达式为:(countryA = 目标country OR countryB = 目标country) AND (CityA = 目标city OR CityB = 目标city),可以按以下两种方案实现:
方案1:使用Firestore原生逻辑运算符(推荐,适配新版SDK)
Firebase Firestore 新版SDK已经支持Filter类实现and、or逻辑嵌套,直接组合所有条件单次查询即可,代码示例如下:
import com.google.firebase.firestore.Filter; // 1. 拼接国家匹配的OR条件 Filter countryFilter = Filter.or( Filter.equalTo("countryA", country), Filter.equalTo("countryB", country) ); // 2. 拼接城市匹配的OR条件 Filter cityFilter = Filter.or( Filter.equalTo("CityA", city), Filter.equalTo("CityB", city) ); // 3. 用AND组合两个条件执行查询 colRef.where(Filter.and(countryFilter, cityFilter)).get() .addOnSuccessListener(queryDocumentSnapshots -> { // 此处返回的即为符合要求的所有文档 });
注意:首次运行该查询时大概率会触发索引缺失报错,点击报错内的跳转链接进入Firebase后台,可一键创建对应复合索引,等待索引生效后即可正常查询。
方案2:多查询结果合并(适配旧版不支持原生OR的SDK)
如果你使用的SDK版本较低,不支持Filter逻辑运算符,可以把4种满足规则的字段组合分别查询,最后合并结果、按文档ID去重即可:
// 定义4种符合条件的字段组合查询 Query q1 = colRef.whereEqualTo("countryA", country).whereEqualTo("CityA", city); Query q2 = colRef.whereEqualTo("countryA", country).whereEqualTo("CityB", city); Query q3 = colRef.whereEqualTo("countryB", country).whereEqualTo("CityA", city); Query q4 = colRef.whereEqualTo("countryB", country).whereEqualTo("CityB", city); // 并发执行四个查询,合并去重结果 Tasks.whenAllSuccess(q1.get(), q2.get(), q3.get(), q4.get()) .addOnSuccessListener(results -> { Map<String, DocumentSnapshot> uniqueDocs = new HashMap<>(); for (Object result : results) { QuerySnapshot snapshot = (QuerySnapshot) result; for (DocumentSnapshot doc : snapshot.getDocuments()) { uniqueDocs.put(doc.getId(), doc); } } // uniqueDocs的value集合就是去重后符合要求的所有文档 });
内容的提问来源于stack exchange,提问作者Kennedy Mathinya
相关产品推荐
相关产品推荐

