Как вы уже заметили, 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");
Цепочка нескольких whereEqualTo()
методовразрешено в Firestore.
Или, если вы все еще хотите использовать массивы, просто объедините оба имени в одно:
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);