Расширенная фильтрация продуктов с Cloud Firestore - PullRequest
0 голосов
/ 23 апреля 2020

Структура моего продукта

product2: {
    allAttributes: {
        Color: ['black', 'silver'],
        model: ["hero7"],
        accessories: ["full travel kit", "2 batteries", "2 batteries + charger"],
        brand: ["GoPro"]
    }
    category: ["camping"]
    depositAmount: 1500
    depositAmountTooltip: "Fully refundable security for this product."
    displayrent: 650
    expressDeliveryCharge: 200
    id: "Ur89kjsllljVdQ8MM"
    inventory: 5
    keywords: (6)["Camping", "Outdoor", "Camera", "Electronic", "Gopro", "Action Cameras"]
    longDescription: "longdescription"
    name: "Gopro Hero 7 Black"
    pictures: (3)[{
        …}, {
        …}, {
        …}]
    rank: 4501
    subCategory: (6)["camping", "outdoor", "camera", "electronic", "gopro", "actioncamera"]
}

product1: {
    allAttributes: {
        Color: ['black', 'silver'],
        model: ["hero8"],
        accessories: ["full travel kit", "2 batteries", "2 batteries + charger"],
        brand: ["GoPro"]
    }
    category: ["camping"]
    depositAmount: 2000
    depositAmountTooltip: "Fully refundable security for this product."
    displayrent: 750
    expressDeliveryCharge: 200
    id: "Ur89kfksj1mVdQ8MM"
    inventory: 5
    keywords: (6)["Camping", "Outdoor", "Camera", "Electronic", "Gopro", "Action Cameras"]
    longDescription: "longdescription"
    name: "Gopro Hero 8 Black"
    pictures: (3)[{
        …}, {
        …}, {
        …}]
    rank: 4500
    subCategory: (6)["camping", "outdoor", "camera", "electronic", "gopro", "actioncamera"]
}

Я запрашиваю его как

const {category, subCategory, color, brand } = req.query;
       AllProductModel.where('category', '==', category)
      .where('subCategory', 'array-contains-any', subCategory)
      .get()

Теперь я не могу делать запросы на основе color (массив из запроса Атрибуты .query) и brand (массив из req.query). Как запросить такие продукты в Cloud Firestore на основе allAttributes, выбранной на стороне клиента. Я не хочу делать это в клиентском приложении.

Я использую "ReactJS" и "NodeJS, Express".

1 Ответ

0 голосов
/ 23 апреля 2020

Если product1 и product2 являются документами в коллекции (скажем, products), то вы можете выбрать, например, все продукты, доступные в серебре, с:

let productsRef = firebase.firestore().collection('products');
productsRef.where("allAtributes.Color", "array-contains", "silver")

. Приведенный выше запрос использует array-contains предложение .


. Вы также можете выбрать все продукты, которые доступны в серебристом или черном цвете:

productsRef.where("allAtributes.Color", "array-contains-any", ["silver", "black"])

Это так называемое предложение array-contains-any может:

использовать оператор array-contains-any для объединения до 10 array-contains предложений в одном поле с логическим ИЛИ.


Вы можете выполнить вышеуказанные пункты запроса для любого из полей в allAttributes. Но вы можете сделать это предложение только на одном поле. Из документации об ограничениях запросов :

Вы можете использовать только одно предложение in или array-contains-any на запрос. Вы не можете использовать как in, так и array-contains-any в одном запросе.

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

Если вы сохраните марку как однозначное поле, например:

    "allAttributes": {
        ...
        brand: "GoPro"
    }

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

productsRef
  .where("allAtributes.brand", "==", "GoPro")
  .where("allAtributes.Color", "array-contains-any", ["silver", "black"])

Чтобы получить все продукты GoPro, которые доступны в серебристом или черном цвете, но, конечно, в этот момент каждый продукт может быть только одного бренда.


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

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