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

# #firebase #google-cloud-firestore

Вопрос:

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

Как я могу отключить сортировку по цене?

Изменить: Я использую FireSQL для запроса своей базы данных Firestore. Ниже я включил часть своего приложения React.

     var sqlQuery = 'SELECT * FROM products WHERE';

    if(selectedCategories.length > 0) {
        var categoryQuery = "('"   selectedCategories.join("','")   "')";
        sqlQuery  = ` category IN ${categoryQuery} AND`;
    }

    sqlQuery  = ` (price >= ${PriceLowerBound} AND price <= ${PriceUpperBound})`

    fireSQL.query(sqlQuery).then(documents => {
        setProductList(documents);
    });
 

В настоящее время у меня есть 4 продукта:

  1. товар1: категория: «c1», цена 189
  2. товар2: категория: «c2», цена 178
  3. товар3: категория: «c1», цена 128
  4. товар4: категория: «c1», цена 298

Предположим, что ни одна категория не была выбрана, тогда запрос будет ВЫБРАН * ИЗ продуктов, ГДЕ (цена >= 128 И цена ><= 298), и я получу продукты в следующем порядке:

  1. товар3: категория: «c1», цена 128
  2. товар2: категория: «c2», цена 178
  3. товар1: категория: «c1», цена 189
  4. товар4: категория: «c1», цена 298

Когда я запускаю этот запрос в первый раз, firebase выдала мне ошибку и ссылку, и я создал следующий индекс: «категория по возрастанию цена по возрастанию». Из-за этого индекса я получаю товары, цена на которые отсортирована в порядке возрастания. Тем не менее, я ожидаю получить продукты в предыдущем заказе.

Я даю пользователям возможность изменять привязку к цене и привязку к цене, добавлять/удалять категории для фильтрации. Я также хочу добавить опцию «ЗАКАЗАТЬ ПО цене ASC/DESC». Итак, я не хочу, чтобы продукты сортировались, когда я не пишу часть «ЗАКАЗ ПО».

Комментарии:

1. Пожалуйста, опубликуйте, что вы пробовали до сих пор

Ответ №1:

Вы должны опубликовать то, что вы пробовали до сих пор, как предложил @Ashish. Мы даже не знаем, какой язык вы используете. 🙂

Но для Javascript для начала было бы что-то вроде приведенного ниже.

 let minPrice = 45;
let maxPrice = 300;
let productCat = "mugs";
const query = db.collection("products").where("price", ">=", minPrice).where("price", "<=" maxPrice).where("category", "==", productCat).get();
 

Но этого будет недостаточно. Чтобы Firestore мог быстро выполнять запросы, ему необходимо объединить «категорию» и «цену» в новом индексе. Это индекс, в котором категория и цена связаны вместе в длинной таблице с соответствующими идентификаторами документов.

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

Вашим решением было бы заказать их снова на стороне клиента таким образом, чтобы это имело смысл для вашего бизнес-кейса.

Если вы можете опубликовать свой код, мы могли бы дать вам пример того, как заказать результаты, которые вы получаете в Firestore на стороне клиента.