Создание индексации для динамического пути с аннотированными точками в firestore [Wildcard]?

Моя коллекция создана как показано ниже:

-products
  -productID
    -category [object]
      catitem1 - boolean
      catitem2 - boolean

Теперь я написал запрос, как показано ниже

this.afs.collection<Product>('products', ref =>
    ref
      .where(`category.${categoryName}`, '==', true)
      .limit(limit)
);

Этот запрос работает нормально, но когда я добавляю orderBy к вышеуказанному запросу, меня просят создать index для запроса.

this.afs.collection<Product>('products', ref =>
    ref
      .where(`category.${categoryName}`, '==', true)
      .orderBy('createdDate','desc')
      .limit(limit)
);

Так как categoryName может быть создан и может быть изменен в любое время, я должен добавить индексацию для каждого categoryName, который будет в сотнях.

Есть ли способ, где я могу создать подстановочный знак для category.categoryName?

Я пытался с помощью category.* но это не приемлемо Надеюсь найти помощь здесь.

1 ответ

Поскольку этот вопрос был задан, Firestore реализовал различные операторы, чтобы помочь с запросом членства в массиве . На момент написания статьи доступны следующие операторы: array-contains, array-contains-any, in, а также not-in.

Вместо хранения category как object с Boolean собственность для каждого categoryName, ты мог бы иметь categoriesмассив, содержащий толькоString имена (или, если вы хотите сэкономить место, Int ids) категорий, членом которых является продукт.

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

      this.afs.collection<Product>('products', ref =>
    ref
      .where('categories', 'array-contains', categoryName)
      .orderBy('createdDate','desc')
      .limit(limit)
);
Другие вопросы по тегам