Empecé a trabajar con la nueva versión modular de Firebase web v9 modular . Y para filtrar el resultado, necesito usar compound queries . Tengo tres entradas:
Cuando filtro el resultado, no siempre hago una solicitud por tres consultas, a veces uso una o dos consultas por solicitud, por lo que no sé cuántas consultas tengo que hacer, siempre es diferente.
Para resolver esto en la versión web v8 namespased , hice este código:
const [firstName, setFirstName] = useState('') const [lastName, setLastName] = useState('') const [type, setType] = useState('') const filterRezult = () => { let filterQuety = db.collection('users') if(firstName !== ''){ filterQuety = filterQuety.where('data.first_name', '==', firstName) } if(lastName !== ''){ filterQuety = filterQuety.where('data.last_name', '==', lastName) } if(type !== ''){ filterQuety = filterQuety.where('data.type', '==', type) } await filterQuety.get().then((result) => { ... }) } Y trabaja muy bien. ¿Alguna sugerencia sobre cómo hacer lo mismo en la versión web v9 modular ?
Eso sería:
const conditions = [] if(firstName !== ''){ conditions.push(where('data.first_name', '==', firstName)) } if(lastName !== ''){ conditions.push(where('data.last_name', '==', lastName)) } if(type !== ''){ conditions.push(where('data.type', '==', type)) } const filterQuery = query(collection(db, 'users'), ...conditions) const result = await getDocs(filterQuery)Recomiendo encarecidamente tener a mano la documentación y la guía de actualización durante este tipo de ejercicio.
Encuentro una solución a esta situación.
Entonces, dado que todos los campos son cadenas no vacías en la base de datos, puedo usar el operador Not equal (!=) en la declaración condicional. Si mi estado no es igual a una cadena vacía, realizo una consulta según la condición requerida, si el estado es una cadena vacía, realizo una consulta de todos los documentos que contienen datos de cadena no vacíos.
Debería verse algo así
const [firstName, setFirstName] = useState('') const [lastName, setLastName] = useState('') const [type, setType] = useState('') const filterRezult = async () => { const searchRef = collection(db, 'users') const querySearch = query(searchRef, (firstName !== '' ? where('data.first_name', '==', firstName) : where('data.first_name', '!=', firstName) ), (lastName !== '' ? where('data.last_name', '==', lastName) : where('data.last_name', '!=', lastName) ), (type !== '' ? where('data.type', '==', type) : where('data.type', '!=', type) } await getDocs(querySearch) .then((result) => { ... }) .catch((error) => { ... }) }No sé si es la mejor solución, pero en mi caso funciona bastante bien.