Firestore-Abfrage nach Datumsbereich


76

Ich benötige die Hilfe, um eine lange Sammlung mit Datumsbereich abzufragen. Siehe das folgende Beispieldokument. Ich möchte das Feld startTime anhand des Datumsbereichs abfragen.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Antworten:


125

Da ich das dueDateFeld im Cloud Firestore als "Zeitstempel" (und NICHT als Zeichenfolge oder Nummer ) gespeichert habe , habe ich dies getan, um die Rechnungsdokumente mit einem Fälligkeitsdatum für 2017 zu erhalten:

let start = new Date('2017-01-01');
let end = new Date('2018-01-01');

this.afs.collection('invoices', ref => ref
  .where('dueDate', '>', start)
  .where('dueDate', '<', end)
);

HINWEIS: Das dueDate Feld wurde in der Firebase mit einem Date () -Objekt gespeichert. z.B:this.doc.dueDate = new Date('2017-12-25')


1
Wenn Sie einen Screenshot Ihres Firestores machen, ist es dann möglich, den Unterschied zwischen einem Datum / Uhrzeit-Objekt oder einer Zeichenfolge visuell zu erkennen?
DauleDK

Ja @DauleDK look: imgur.com/a/draQo Das dritte Feld wurde mit einem Date () js-Objekt gefüllt und als Zeitstempel gespeichert (Firebase hat die Konvertierung durchgeführt). Und auf dem Bild sehen Sie diesen Zeitstempel als UTC formatiert, ABER ich habe ihn als Datumsobjekt gespeichert. Und um zu überprüfen, ob dies wirklich ein Zeitstempelfeld ist, bewegen Sie den Mauszeiger über das Feld. In meinem Fall sehe ich "Marca de tiempo", was "Zeitstempel" bedeutet.
Capy

3
Wow, das ist großartig - etwas, das definitiv zur Dokumentation der Firestore-Abfrage hinzugefügt werden sollte. Ich habe das Gefühl, dass wir viele Updates für die Firebase-Firestore-Konsole sehen werden. "Marce de tiempo" - wertvollste Lektion, die heute gelernt wurde, gracias;)
DauleDK

2
Freunde, ich habe es versucht, aber es gibt nichts zurück
Nimer Farahty

Wenn Sie eine zusätzliche Äquivalenzabfrage '==' verwenden, müssen Sie möglicherweise einen zusammengesetzten Index aktivieren. Der beste Weg, dies zu tun, besteht darin, den Fehler abzufangen, der einen Firebase-Link ausgibt, dem Sie zur automatischen Einrichtung folgen können Der Index. Meine Anfrage sieht so aus und benötigt einen Composite_Index:.where('team_id', '==', teamId).where('time', '>=', start).where('time', '<=', end)
wdavies973

24

Sie können das datetime-Objekt als Unix-Zeit speichern (Sekunden seit dem 1. Januar 1970). Dann können Sie einfach die where select wie folgt verwenden:

collectionRef.where("startTime", ">=", "1506816000").where("startTime", "<=", "1507593600")

Übrigens: Um in Ihrer App von Datum / Uhrzeit in Unix-Zeit zu konvertieren, können Sie den hervorragenden Moment der Bibliothek nutzen (wenn Sie etwas mit js oder node erstellen).


1
Danke, aber ich habe bereits Daten mit Datumsformat, genau wie der beigefügte Screenshot
Nimer Farahty

OK. Laut Firebase ist datetime ein unterstützter Datentyp im Firestore. Ist die startTime eine Zeichenfolge oder ein Datum / Uhrzeit-Objekt?
DauleDK

es ist dateTime Objekt es ist kein String
Nimer Farahty

können Sie einen Screenshot von der Firebase-Konsole machen - wo Sie die Maus über Ihre startTime bewegen - um zu sehen, ob datetime wie hier angezeigt wird imgur.com/a/draQo
DauleDK

hinzugefügt, um neuen Screenshot in Frage zu stellen, scheint es, dass die
Datenzeit ein

19
    var startfulldate = admin.firestore.Timestamp.fromDate(new Date(1556062581000));
    db.collection('mycollection')
      .where('start_time', '<=', startfulldate)
      .get()
      .then(snapshot => {              
            var jsonvalue: any[] = [];
            snapshot.forEach(docs => {
              jsonvalue.push(docs.data())
               })
                 res.send(jsonvalue);
                 return;
                }).catch( error => {
                    res.status(500).send(error)
                });

2
Toll ! Du hast mein Leben gerettet, Mann. Ich habe gerade admin.firestore durch firebase.firestore ersetzt und es hat funktioniert.
Fox5150

11
const event = new Date();
const expirationDate = admin.firestore.Timestamp.fromDate(event);
const query = collectionRef.where('startTime', '<=', expirationDate)

5

Für alle, die kürzlich Firbase Firestore verwenden. Abhängig von Ihren Einstellungen für Ihre Firebase-Implementierung (je nach Firebase-Version) gibt es Unterschiede.

Vorher spart Fires Timestampals Datejedoch wie beschrieben in der Dokumentation hier wird die bald durch ein ersetzt werden TimestampObjekt. Die Timestamp-Dokumente finden Sie hier .

Sie können Ihre Implementierung bereits erzwingen, indem Sie eine Einstellung in Ihren Code einfügen , um Firebase zu zwingen, Zeitstempelobjekte anstelle von Datum zu verwenden, wie in diesem Beispiel:

var firebaseApp = firebase.initializeApp({
    apiKey: [APIKEY],
    authDomain: [FIREBASEAPPDOMAIN],
    projectId: [PROJECTID]
});

var firestore = firebase.firestore();
var settings = { timestampsInSnapshots: true }; // force Timestamp instead of Date
firestore.settings(settings);

1

Diejenigen, die wie ich PHP verwenden, um auf Firestore zuzugreifen, können Folgendes tun:

$startTime = new DateTime('2020-05-23 00:00:00');
$endTime = new DateTime('2020-06-23 23:59:59');

$start = new Google\Cloud\Core\Timestamp($startTime);
$end = new Google\Cloud\Core\Timestamp($endTime);

// fb is a Google\Cloud\Firestore\FirestoreClient object
$this->query = $this->fb->collection('your_collection');

$aux = $this->query;
$aux = $aux->where('startTime', '<', $end);
$aux = $aux->where('startTime', '>', $start);

return $aux->documents();

Genießen.


1

Die Lösung besteht darin, Date.now () zu verwenden und die Verwendung des Zeitstempeldienstes von Firebase zu beenden. Sie müssen mit dem numerischen Wert der Zeit in Millisekunden arbeiten, z. B.: 1514271367000, stattdessen, wenn der Firestore den 26.12.2017 verwendet. 1:56: 07 GMT-0500 (-05) funktioniert nicht. Ein Beispiel für eine Abfrage ist:

this.fsService.afs.collection('chats/4bY1ZpOr1TPq8bFQ3bjS/finance/123+finance/12345'
          , ref => ref.orderBy('hour').startAt(1514184967000).endAt(1514271367000))
          .valueChanges().subscribe(data =>{
            this.mensajes = data;
          })

2
Ist es in Ordnung, wenn Firestore Date.now () als Zahlendaten speichert? Ich habe das Gefühl, dass ein Date in einigen Fällen besser ist, nur aus diesem Grund und wegen des einfachen Verständnisses.
Telion

Dies scheint Firebase Realtime Database-Code zu sein (z. B. verwendet er startAtund endAt), nicht Firestore-Code (der verwendet werden würde where, siehe hier ). Die beiden sind ähnlich, aber nicht gleich.
Robsiemb

Was ist die Zeitzone gedacht. Soll ich bei der Ermittlung der Nummer die Datums- und Uhrzeitangabe in GMT konvertieren?
Csaba Toth

0

In einer Frontend-Anwendung können Firebase-Zeitstempel und -Daten auf diese Weise zum Abfragen und Speichern von Dokumenten verwendet werden.

Verwendung des Firestore-Datums


2
Hallo. So nützlich externe Links auch sein mögen, fügen Sie den Inhalt Ihrer Antwort direkt in SO ein.
Maciej Jureczko

0

Allgemeine Funktion zum Suchen von Dokumenten in einer Sammlung nach Datumsbereich von Spezifikationsfeldern:

public List<QueryDocumentSnapshot> findDocsByDateRange(String collection, 
                                                       String fieldStartDate,
                                                       String fieldEndDate,
                                                       Date startDate, 
                                                       Date endDate) {
    ApiFuture<QuerySnapshot> querySnapshot = fireStore()
                    .collection(collection)
                    .whereGreaterThanOrEqualTo(FieldPath.of(fieldStartDate), startDate)
                    .whereLessThanOrEqualTo(FieldPath.of(fieldEndDate), endDate)
                    .get();
    return querySnapshot.get().getDocuments();
}

Pakete:

import com.google.api.core.ApiFuture;
import com.google.cloud.firestore.DocumentSnapshot;
import com.google.cloud.firestore.FieldPath;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.