database - google - firebase cloud firestore documentation
¿Cómo realizar consultas compuestas con OR lógico en Cloud Firestore? (5)
De los documentos :
También puede encadenar múltiples métodos where () para crear consultas más específicas (AND lógico).
¿Cómo puedo realizar una consulta
OR
?
Ejemplo:
-
Dame todos los documentos donde el
status
del campo estáopen
Oupcoming
-
Dame todos los documentos donde el
status == open
del campostatus == open
OcreatedAt <= <somedatetime>
No tendría ningún campo de "estado", sino campos relacionados con el estado, actualizándolos a verdadero o falso según la solicitud, como
{ name: "a", status_open: true, status_upcoming: false, status_closed: false}
Sin embargo, verifique las funciones de Firebase Cloud. Podría tener una función escuchando cambios de estado, actualizando propiedades relacionadas con el estado como
{ name: "a", status: "open", status_open: true, status_upcoming: false, status_closed: false}
uno u otro, su consulta podría ser solo
...where(''status_open'',''=='',true)...
Espero eso ayude.
Tenemos el mismo problema en este momento, afortunadamente, los únicos valores posibles para los nuestros son A, B, C, D (4), por lo que debemos consultar cosas como A || B, A || C, A || B || C, D, etc.
Desde hace unos meses, firebase admite una nueva consulta que
array-contains
una
array-contains
por lo que lo que hacemos es hacer una matriz y preprocesamos los valores OR a la matriz
if (a) {
array addObject:@"a"
}
if (b) {
array addObject:@"b"
}
if (a||b) {
array addObject:@"a||b"
}
etc
¡Y hacemos esto para los
4!
valores o cuantos combos hay.
ENTONCES simplemente podemos verificar la consulta
[document arrayContains:@"a||c"]
o cualquier tipo de condición que necesitemos.
Entonces, si algo solo califica para el
A
condicional de nuestros 4 condicionales (A, B, C, D), entonces su matriz contendrá las siguientes cadenas literales:
@["A", "A||B", "A||C", "A||D", "A||B||C", "A||B||D", "A||C||D", "A||B||C||D"]
Luego, para cualquiera de esas combinaciones
OR
, podemos simplemente buscar el contenido de la
array-contains
en lo que queramos (por ejemplo, "A || C")
Nota: Este es solo un enfoque razonable si tiene unos pocos valores posibles para comparar O con.
Más información sobre Array-contiene aquí , ya que es nuevo en documentos de firebase
puede vincular dos Observables utilizando el operador de combinación rxjs. Aquí tienes un ejemplo.
import { Observable } from ''rxjs/Observable'';
import ''rxjs/add/observable/merge'';
...
getCombinatedStatus(): Observable<any> {
return Observable.merge(this.db.collection(''foo'', ref => ref.where(''status'',''=='',''open'')).valueChanges(),
this.db.collection(''foo'', ref => ref.where(''status'',''=='',''upcoming'')).valueChanges());
}
Luego puede suscribirse a las nuevas actualizaciones de Observable utilizando el método anterior:
getCombinatedStatus.subscribe(results => console.log(results);
Espero que esto pueda ayudarte, saludos desde Chile !!
sugiera dar valor para el estado también.
ex.
{ name: "a", statusValue = 10, status = ''open'' }
{ name: "b", statusValue = 20, status = ''upcoming''}
{ name: "c", statusValue = 30, status = ''close''}
puede consultar por
ref.where(''statusValue'', ''<='', 20)
luego se encontrarán
''a''
y
''b''
.
Esto puede ahorrarle el costo y el rendimiento de su consulta.
por cierto, no se arregla todo el caso.
OR
no es compatible ya que es difícil para el servidor escalarlo (requiere mantener el estado para deducir).
La solución consiste en emitir 2 consultas, una para cada condición, y deducir en el cliente.