无法查询多个值的Firestore数据库

时间:2019-04-15 09:45:16

标签: firebase google-cloud-firestore

我有一个充满汽车的数据库。 JSON的格式是这样的:

docId: {
        "countries": ["Netherlands"]
        "cities": ["Amsterdam"]
   }

我无法查询两个数组。

db.collection("EU-CARS")
    .whereArrayContains("countries", "Netherlands")
    .whereArrayContains("cities", "Amsterdam");

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您已经注意到,Firestore允许您仅使用一个whereArrayContains()方法调用来过滤汽车。如果您将使用多个,则将发生如下错误:

  

原因:java.lang.IllegalArgumentException:无效的查询。查询仅支持具有单个包含数组的过滤器。

有两种方法可以解决此问题。第一个是这样更改汽车文档的结构:

docId
  |
  --- filters
       |
       --- "country": "Netherlands"
       |
       --- "city": "Amsterdam"

通过这种方式,您可以使用以下方法过滤数据库:

Query query = db.collection("EU-CARS").
    .whereEqualTo("filters.country", "Netherlands")
    .whereEqualTo("filters.city", "Amsterdam");

在Firestore中允许束缚多个whereEqualTo()方法。

或者,如果您仍然想使用数组,只需将两个名称连接成一个单数:

docId
  |
  --- "countries_cities": ["Netherlands_Amsterdam", "Netherlands_Utrecht"]

相应的查询应如下所示:

db.collection("EU-CARS")
    .whereArrayContains("countries_cities", "Netherlands_Amsterdam");

编辑:

如果您有多个国家/城市,则文档的结构应如下所示:

docId
  |
  --- filters
       |
       --- "Netherlands": true
       |
       --- "Amsterdam": true
       |
       --- "Utrecht": true

通过这种方式,您可以使用以下方法过滤数据库:

Query query = db.collection("EU-CARS").
    .whereEqualTo("filters.Netherlands", true)
    .whereEqualTo("filters.Amsterdam", true);