Невозможно запросить базу данных Firestore для нескольких значений - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть база данных, полная автомобилей.Формат JSON такой:

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

Я не могу запросить оба массива.

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

Как решить эту проблему?

1 Ответ

1 голос
/ 15 апреля 2019

Как вы уже заметили, 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...