首页 > 解决方案 > firebase firestore 复合查询

问题描述

UserTable
---------
Username
Age
Gender
countryA
countryB
CityA
CityB

国家=意大利,城市= Jhb;

想通过查询firestore来实现以下

if(country==countryA || country == countryB){
    
    if(city == CityA || city == CityB){
        //TODO
        return the document;
    }
}

试图通过查询firestore来实现上述目标

CollectionReference colRef = fireStore.collection("UserTable");

colRef.whereEqualTo("countryA",country).get();
colRef.whereEqualTo("countryB",country).get();
   
colRef.whereEqualTo("CityA",city).get();
colRef.whereEqualTo("CityB",city).get();

我接下来要编码什么?

如何组合查询以取得成功的结果

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


如果您的文档如下所示:

$user (document)
 |
 --- Username: "Kennedy"
 |
 --- Age: 20
 |
 --- Gender: "male"
 |
 --- Country: "USA"
 |
 --- City: "NY"

使用以下逻辑是有意义的:

if(country==countryA || country == countryB)

因为这意味着您要执行 OR 查询。这可以在 Java 中通过以下方式实现,最多十个元素:

colRef.whereIn("Country", Arrays.asList("countryA", "countryB"));

但是,有一个约束。您不能添加另一个:

.whereIn("City", Arrays.asList("CityA", "CityA"));

因为每个查询最多可以使用一个whereIn子句。要解决这个问题,您必须使用第一个查询并过滤客户端中的城市。

回到最初的查询:

colRef.whereEqualTo("countryA",country).get();
colRef.whereEqualTo("countryB",country).get();
   
colRef.whereEqualTo("CityA",city).get();
colRef.whereEqualTo("CityB",city).get();

我看到您对“countryA”和“countryB”以及“CityA”和“CityB”使用不同的字段,最终具有如下所示的模式:

$user (document)
 |
 --- Username: "Kennedy"
 |
 --- Age: 20
 |
 --- Gender: "male"
 |
 --- countryA: "A"
 |
 --- CityA: "A"
 |
 --- CountryB: "B"
 |
 --- CityB: "B"

这也意味着这些查询不能帮助您执行 OR 操作。因此,您很可能应该考虑使用第一个数据库模式并执行whereIn()查询并过滤内存中的结果。


推荐阅读