Два где массив-содержится в одном запросе Google Cloud Firestore. Применить фильтр товаров с сортировкой внутри поиска - PullRequest
0 голосов
/ 02 марта 2020

Я застрял с ограничениями firebase . То, чего я хочу достичь, - это два, где массив содержит в одном запросе, а firestore не позволяет этого, он ограничен одним на запрос.

У меня есть набор ключевых слов в моей коллекции продуктов. например. ключевые слова: ['men','men-clothing', 'men-clothing-denim']

Я хочу искать товары на основе массива ключевых слов, например, если пользователь ищет мужскую одежду и фильтрует товар, выбирая бренд скажем джинсовая. Затем ключевое слово часто добавляется и заканчивается строкой «men-clothing-brands-denim». Теперь я хочу найти в своей коллекции товаров то же ключевое слово, которое я использую Where («ключевые слова», «массив-содержит», «мужская одежда-бренд-джинсовая»).

Проблема в том, что у меня также есть сортировка в моем приложении, поэтому, если пользователи выбирают «от низкого до высокого», я также хочу отсортировать продукт одновременно с применением фильтра. Я сортирую товары только по ключевым словам.

Firestore не позволяет использовать два массива Where в одном запросе. Я также хочу отсортировать свои продукты, когда пользователь подаст заявку на фильтр.

Для сортировки я использую where('keywords', 'array-contains', 'men-clothing');

Поэтому, в конце концов, если я хочу достичь обоих, мне нужно написать запрос как:

db.collection('products').where('keywords', 'array-contains', 'men-clothing').where('price', 'desc').where('keywords','array-contains', 'men-clothing-brand-denim').get()

и firestore не поддерживает два, где array-содержится в одном запросе, что является лучшим способом добиться этого с помощью firestore. Весь этот сценарий относится к моему компоненту поиска приложений электронной коммерции, где пользователь ищет товары, и появляется список товаров, где пользователь может фильтровать и сортировать товары.

1 Ответ

1 голос
/ 02 марта 2020

Я хочу достичь двух, где массив содержится в одном запросе, а Firestore не позволяет

Вы абсолютно правы. Если вы будете использовать более одного array-contains, поскольку произойдет следующая ошибка:

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

Однако, если вам нужно одновременно фильтровать ключевые слова men-clothing и men-clothing-brand-denim, существует обходной путь, который может помочь вам решить Эта проблема. Как вы уже заметили, вы не можете использовать array-contains, но вы можете внести небольшое изменение в лог c вашей схемы базы данных. Поэтому вам следует рассмотреть возможность создания нового свойства для каждого отдельного значения из массива keywords, а затем объединить несколько вызовов метода where(). Вызывая этот метод несколько раз, он совершенно допустим.

Ваша схема должна выглядеть следующим образом:

keywords: { 
    "men": true,
    "men-clothing": true,
    "men-clothing-denim": true
}

Как вы можете видеть, keywords больше не является массивом, это Map. Таким образом, используя такую ​​схему, вы сможете найти все документы, которые соответствуют men-clothing и men-clothing-denim одновременно. Требуемый запрос выглядит примерно так:

db.collection('products')
    .where("men-clothing", "==", true)
    .where("men-clothing-denim", "==", true);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...