Фильтр запросов Firestore на несколько файлов - PullRequest
0 голосов
/ 21 января 2019

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

Например, для этого типа документов я хотел бы получить все документы с динамическими фильтрами (меня не волнуетзначение в других полях).

Я не могу составить индекс для всех возможных вариантов, потому что с 25-30 полями, которые могут быть потенциальным фильтром, я достигаю предела 200 индекса.

IЯ не видел способа использовать whereArrayContains с несколькими значениями.

exemple:
array -> [computer, internet, ps4,switch]
filter -> whereArrayContains("gears", "internet" AND "switch")

Так что, если у кого-то есть идеи, как мне добиться этого или любого обходного пути ... Было бы очень признательно, потому что япопытка «исправить» эту проблему за несколько дней безуспешно

пример фильтра:

- internet + wifi + computer = true
- internet + ps4 + tv + xbox = true
- ps4 + xbox = true
- any random génération

тип документа:

1

1 Ответ

0 голосов
/ 21 января 2019

К сожалению, вы можете отфильтровать ваши элементы, используя только один whereArrayContains() вызов метода. Если вы будете использовать более одного, произойдет следующая ошибка:

Причина: java.lang.IllegalArgumentException: недопустимый запрос. Запросы поддерживают только наличие одного фильтра, содержащего массив.

Если вам нужно отфильтровать более одного свойства, вам нужно изменить логику структурирования вашей базы данных, создав свойство для каждого отдельного фильтра, который вы используете, а затем связав whereEqualTo() вызовы методов. Я знаю, это звучит немного странно, но так работает Cloud Firestore.

Ваша схема должна выглядеть так:

documentId: { 
    "computer": true,
    "internet": true,
    "ps4": true,
    "switch": true
}

Чтобы найти все элементы, которые "gears", "internet" and "switch", вы должны использовать запрос, который выглядит следующим образом:

Query query = yourCollectionRef.
    .whereEqualTo("gears", true)
    .whereEqualTo("internet", true)
    .whereEqualTo("switch", true);

Вы также можете сохранить эти фильтры на карте, как показано в следующей схеме:

documentId: {
    gears: {
        "computer": true,
        "internet": true,
        "ps4": true,
        "switch": true
    }
}

И соответствующий запрос должен выглядеть так:

Query query = yourCollectionRef.
    .whereEqualTo("gears.gears", true)
    .whereEqualTo("gears.internet", true)
    .whereEqualTo("gears.switch", true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...