Невозможно запросить базу данных Firestore по нескольким значениям

#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. О да, вы правы. Мой плохой, извините за это, пожалуйста, посмотрите мой обновленный ответ.