Firestore: поиск по ключевым словам в нескольких документах - PullRequest
0 голосов
/ 21 июня 2020

Я использую Firestore для хранения данных для нескольких объектов. В этом примере каждый документ представляет собой компанию с подробными сведениями о продаваемых ею продуктах, и каждый продукт связан с несколькими ключевыми словами. Пример структуры:

Документ 1:

    company_name: 'Company 1',
    products: [
        {
            name: 'Green tea',
            keywords: ['green tea', 'healthy, 'matcha']
        },
        {
            name: 'Sushi',
            keywords: ['sushi', 'rice', 'healthy']
        }
    ]

Документ 2:

    company_name: 'Company 2',
    products: [
        {
            name: 'Apple',
            keywords: ['fruit', 'healthy']
        },
        {
            name: 'Cake',
            keywords: ['dessert', 'sweet']
        }
    ]

Я хотел бы найти компании, которые продают продукты с определенными ключевыми словами. Например, при поиске по ключевому слову healthy будут возвращены оба документа Company 1 и Company 2, так как они оба продают продукты с этим ключевым словом. Как мне сделать это с помощью фильтрации / поиска Firestore?

1 Ответ

2 голосов
/ 21 июня 2020

Теперь, когда ваши данные структурированы, с несколькими элементами массива полей, содержащими значения для поиска, невозможно, чтобы один запрос нашел все, что вы хотите. Проблема здесь в массивах. Просто невозможно выполнить поиск во вложенном содержимом полей массива.

Когда у вас есть элементы массива, которые необходимо сопоставить индивидуально с запросами, они должны быть отдельными документами в коллекции. Да, больше операций чтения и записи, но это также означает, что ваши запросы станут возможными. было поле под названием ключевые слова.

companies (collection)
  document 1 (doc)
    company_name: string field
    products (subcollection)
      keywords: string array field

С его помощью вы могли затем выполнить запрос группы сбора для всех продуктов во всех компаниях, подобных этой (в JavaScript):

db.collectionGroup("products").where("keywords", "array-contains", keyword)

где keyword - это слово, которое вы ищете.

...