我在进行查询时遇到了一些麻烦,使我可以对多个动态字段进行过滤。
对于这种文档类型的示例,我想使用动态过滤器获取所有文档(我不在乎其他字段中的值)。
我无法为所有可能的情况建立复合索引,因为25-30个字段(可能是潜在的过滤条件)达到了200个索引限制。
我还没有办法使用具有多个值的whereArrayContains
。
exemple:
array -> [computer, internet, ps4,switch]
filter -> whereArrayContains("gears", "internet" AND "switch")
因此,如果有人对我如何实现此目标或任何变通办法有任何想法...,将不胜感激,因为自几天以来我一直试图“解决”此问题,但未成功
- internet + wifi + computer = true
- internet + ps4 + tv + xbox = true
- ps4 + xbox = true
- any random génération
答案 0 :(得分:1)
不幸的是,您只能使用一个whereArrayContains()
方法调用来过滤项目。如果您将使用多个,则将发生以下错误:
原因:java.lang.IllegalArgumentException:无效的查询。查询仅支持具有单个包含数组的过滤器。
如果需要过滤多个属性,则需要通过为每个具有的单个过滤器创建一个属性,然后链接whereEqualTo()
方法调用来更改数据库结构的逻辑。我知道这听起来有些怪异,但这就是Cloud Firestore的工作方式。
您的模式应为:
documentId: {
"computer": true,
"internet": true,
"ps4": true,
"switch": true
}
要查找所有"gears", "internet" and "switch"
的项目,应使用如下查询:
Query query = yourCollectionRef.
.whereEqualTo("gears", true)
.whereEqualTo("internet", true)
.whereEqualTo("switch", true);
您还可以将这些过滤器存储在地图中,如下图所示:
documentId: {
gears: {
"computer": true,
"internet": true,
"ps4": true,
"switch": true
}
}
相应的查询应如下所示:
Query query = yourCollectionRef.
.whereEqualTo("gears.gears", true)
.whereEqualTo("gears.internet", true)
.whereEqualTo("gears.switch", true);