多个文件上的Firestore查询过滤器

时间:2019-01-21 17:10:26

标签: java android firebase google-cloud-firestore

我在进行查询时遇到了一些麻烦,使我可以对多个动态字段进行过滤。

对于这种文档类型的示例,我想使用动态过滤器获取所有文档(我不在乎其他字段中的值)。

我无法为所有可能的情况建立复合索引,因为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

文档类型:

1

1 个答案:

答案 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);