java - 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();
我接下来要编码什么?
如何组合查询以取得成功的结果
解决方案
如果您的文档如下所示:
$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()
查询并过滤内存中的结果。
推荐阅读
- selenium - Selenium UI 自动化测试的代码覆盖率工具
- php - 在 MacOS 上安装 Apache、PHP、MySql 和 phpMyAdmin
- grpc - gRPC 连接:使用 keepAlive 还是 idleTimeout?
- sql - Oracle sql查询按几列获取记录组
- jquery - 未捕获的引用错误:应用引导模板后未定义 $
- cartopy - 对空 Cartopy 流图进行故障排除
- python - Python 提取/解压缩 RAR 文件错误
- python - 向 lambda 或函数添加计算
- c++ - 我可以使用 unique_lock 锁定互斥锁并安全地返回变量吗?我必须先复制它吗?
- java - 错误:无法找到或加载主类 org.apache.maven.wrapper.MavenWrapperMain