Estoy haciendo un filtro para que un usuario pueda buscar exactamente unos pocos parámetros, sin tener que ponerlos todos en el formulario. Por ejemplo, podría buscar juegos de tipo X pero de todos los géneros (deje el formulario vacío y es una matriz vacía).
Intenté hacer toda la consulta al mismo tiempo, pero como hay matrices vacías, se lanza una excepción. En consecuencia, he pensado en ir paso a paso revisando los parámetros del filtro y descartando los vacíos, pero no sé cómo guardar cada paso en la referencia.
Tecnologías:
Código de servicio:
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' });}
Código del modelo:
export interface Filter { genders: string[]; types: string[]; }Los objetos de consultas de Firestore son inmutables. Llamar a where en una referencia o consulta no modifica el objeto existente, sino que devuelve una nueva consulta con la condición adicional.
Entonces, para devolver la nueva consulta, haría algo como:
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' });