我有一个充满汽车的数据库。 JSON
的格式是这样的:
docId: {
"countries": ["Netherlands"]
"cities": ["Amsterdam"]
}
我无法查询两个数组。
db.collection("EU-CARS")
.whereArrayContains("countries", "Netherlands")
.whereArrayContains("cities", "Amsterdam");
如何解决这个问题?
答案 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);