webentwicklung-frage-antwort-db.com.de

So führen Sie zusammengesetzte Abfragen mit logisch aus OR in Cloud Firestore?

Von den Dokumenten :

Sie können auch mehrere where () - Methoden verketten, um spezifischere Abfragen zu erstellen (logisches UND).

Wie kann ich eine OR-Abfrage durchführen? Beispiel: 

  1. Gib mir alle Dokumente, bei denen das Feld statusopen OR upcoming ist.
  2. Gib mir alle Dokumente, in denen das Feld status == open OR createdAt <= <somedatetime>
17
ProblemsOfSumit

OR wird nicht unterstützt, da es für den Server schwer ist, ihn zu skalieren (dies erfordert das Beibehalten des Status). Um dies zu umgehen, geben Sie zwei Abfragen (eine für jede Bedingung) und einen deduierten Client an.

12
Dan McGrath

Ich hätte kein "Status" -Feld, sondern Statusbezogene Felder, die je nach Anforderung auf "True" oder "False" gesetzt werden 

{ name: "a", status_open: true, status_upcoming: false, status_closed: false}

Überprüfen Sie jedoch die Firebase Cloud-Funktionen. Der Status des Funktionsüberwachungsstatus könnte geändert werden, und Status-bezogene Eigenschaften werden aktualisiert

{ name: "a", status: "open", status_open: true, status_upcoming: false, status_closed: false}

die eine oder andere, könnte Ihre Anfrage nur sein

...where('status_open','==',true)...

Ich hoffe es hilft.

2
norgematos

Wir haben im Moment das gleiche Problem, zum Glück sind die einzig möglichen Werte für uns A, B, C, D (4), also müssen wir nach Dingen wie A || B, A || C, A || B || fragen C, D usw


Ab wie vor ein paar Monaten unterstützt firebase eine neue Abfrage array-contains Also machen wir ein Array und verarbeiten die OR= Werte zum Array vor

if (a) {
array addObject:@"a"
}
if (b) {
array addObject:@"b"
}
if (a||b) {
array addObject:@"a||b"
}
etc

Und das machen wir für alle 4! Werte oder wie viele Kombinationen es gibt.

DANN können wir einfach die Abfrage überprüfen [document arrayContains:@"a||c"] oder welche Art von Bedingung wir brauchen.

Wenn also etwas nur für bedingte A unserer 4 Bedingungen (A, B, C, D) qualifiziert wäre, würde sein Array die folgenden Literalzeichenfolgen enthalten: @["A", "A||B", "A||C", "A||D", "A||B||C", "A||B||D", "A||C||D", "A||B||C||D"]

Dann können wir für jede dieser OR Kombinationen array-contains nach Belieben (z. B. "A || C")


Hinweis: Dies ist nur dann sinnvoll, wenn Sie einige mögliche Werte zum Vergleichen haben OR mit.

Weitere Informationen zu Array-enthält hier , da es neu für Firebase-Dokumente ist

1
Albert Renshaw

sie können zwei Observables mit dem Merge-Operator "rxjs" binden. Hier haben Sie ein Beispiel.

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());
}

Dann können Sie die neuen Observable-Updates mit der obigen Methode abonnieren:

getCombinatedStatus.subscribe(results => console.log(results);

Ich hoffe das kann Ihnen helfen, Grüße aus Chile !!

0

vorschlagen, auch den Status zu bewerten.
ex.

{ name: "a", statusValue = 10, status = 'open' }

{ name: "b", statusValue = 20, status = 'upcoming'}

{ name: "c", statusValue = 30, status = 'close'}

sie können mit ref.where('statusValue', '<=', 20) abfragen, dann werden sowohl 'a' als auch 'b' gefunden.

dies kann Ihre Abfragekosten und Leistung sparen.

Übrigens, es ist nicht alle Fälle zu beheben.

0