#firebase #google-cloud-firestore
#firebase #google-облако-firestore
Вопрос:
У меня есть база данных, заполненная автомобилями. JSON
Формат такой:
docId: {
"countries": ["Netherlands"]
"cities": ["Amsterdam"]
}
Я не могу запросить оба массива.
db.collection("EU-CARS")
.whereArrayContains("countries", "Netherlands")
.whereArrayContains("cities", "Amsterdam");
Как это решить?
Ответ №1:
Как вы уже заметили, Firestore позволяет фильтровать ваши автомобили, используя только один whereArrayContains()
вызов метода. Если вы будете использовать более одного, возникнет ошибка, подобная этой:
Вызвано: java.lang.Исключение IllegalArgumentException: недопустимый запрос. Запросы поддерживают только один фильтр, содержащий массив.
Есть два способа, которыми вы можете решить эту проблему. Первым было бы изменить структуру вашего документа car следующим образом:
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);
Комментарии:
1. Спасибо за ответ. Я пойду с массивами, но как насчет хранения нескольких городов и стран при использовании первого решения? Просто любопытно.
2. О да, вы правы. Мой плохой, извините за это, пожалуйста, посмотрите мой обновленный ответ.