通过单独的步骤过滤 firestore 请求

Filter firestore request by separate steps

我正在制作一个过滤器,以便用户可以准确地搜索几个参数,而不必将它们全部放入表单中。例如,您可以搜索 X 类型但所有类型的游戏(将表格留空,它是一个空数组)。

我曾尝试同时执行整个查询,但由于存在空数组,因此抛出了异常。因此,我想到了一步一步检查过滤器参数并丢弃空参数,但我不知道如何在参考中保存每一步。

技术:

  1. 离子
  2. Angular
  3. Firebase - Firestore

服务代码:

getFilteredResultsGames(filter: Filter) {
return this.firestore.collection<Game[]>(environment.db_tables.games,
  (ref) => {

    if (filter.types.length > 0){
      ref.where('id_type', 'in', filter.types)
    }
    if (filter.genders.length > 0) {
      ref.where('ids_genders', 'array-contains-any', filter.genders)
    }

    return ref
  }).valueChanges({ idField: 'id' });

}

型号代码:

export interface Filter {
  genders: string[];
  types: string[];
}

Firestore 查询对象是不可变的。在引用或查询上调用 where,不会修改现有对象,而是 return 一个具有附加条件的新查询。

因此,对于 return 新查询,您需要执行以下操作:

getFilteredResultsGames(filter: Filter) {
return this.firestore.collection<Game[]>(environment.db_tables.games,
  (ref) => {
    if (filter.types.length > 0){
      ref = ref.where('id_type', 'in', filter.types)
    }
    if (filter.genders.length > 0) {
      ref = ref.where('ids_genders', 'array-contains-any', filter.genders)
    }

    return ref
  }).valueChanges({ idField: 'id' });