tutorial google firestore database firebase google-cloud-platform google-cloud-firestore

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:

  1. Dame todos los documentos donde el status del campo está open O upcoming
  2. Dame todos los documentos donde el status == open del campo status == open O createdAt <= <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.