通过单独的步骤过滤 firestore 请求
Filter firestore request by separate steps
我正在制作一个过滤器,以便用户可以准确地搜索几个参数,而不必将它们全部放入表单中。例如,您可以搜索 X 类型但所有类型的游戏(将表格留空,它是一个空数组)。
我曾尝试同时执行整个查询,但由于存在空数组,因此抛出了异常。因此,我想到了一步一步检查过滤器参数并丢弃空参数,但我不知道如何在参考中保存每一步。
技术:
- 离子
- Angular
- 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' });
我正在制作一个过滤器,以便用户可以准确地搜索几个参数,而不必将它们全部放入表单中。例如,您可以搜索 X 类型但所有类型的游戏(将表格留空,它是一个空数组)。
我曾尝试同时执行整个查询,但由于存在空数组,因此抛出了异常。因此,我想到了一步一步检查过滤器参数并丢弃空参数,但我不知道如何在参考中保存每一步。
技术:
- 离子
- Angular
- 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' });