¿Cómo realizar consultas compuestas con OR lógico en Cloud Firestore?
De los documentos :
También puede encadenar varios métodos where() para crear consultas más específicas (Y lógica).
¿ Cómo puedo realizar una OR
consulta? Ejemplo:
- Dame todos los documentos donde
status
está el campoopen
Oupcoming
- Dame todos los documentos donde está el campo
status == open
OcreatedAt <= <somedatetime>
OR
no es compatible porque al servidor le resulta difícil escalarlo (requiere mantener el estado en deduplicación). La solución alternativa es emitir 2 consultas, una para cada condición, y desduplicar el cliente.
Editar (noviembre de 2019):
Cloud Firestore ahora admite IN
consultas que son un tipo limitado de OR
consulta.
Para el ejemplo anterior, podrías hacer:
// Get all documents in 'foo' where status is open or upcmoming
db.collection('foo').where('status','in',['open','upcoming']).get()
Sin embargo, todavía no es posible realizar una OR
condición general que involucre múltiples campos.
Con la reciente incorporación de consultas IN , Firestore admite "hasta 30 cláusulas de igualdad en el mismo campo con un OR lógico "
Una posible solución a (1) sería:
documents.where('status', 'in', ['open', 'upcoming']);
Consulte las guías de Firebase: operadores de consulta | in
yarray-contains-any
La compatibilidad con consultas OR generales se anunció en Google I/O 2023 , por lo que, según la documentación, una solución para (2) sería:
query(collection(db, '{collection-name}'), or(
where('status', '==', 'open'),
where('createdAt', '<=', somedatetime),
));
Vea un ejemplo completo en GitHub/firebase: snippets-node: index.js#orQueries .