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.
Antworten:
Da ich das dueDate
Feld 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')
.where('team_id', '==', teamId).where('time', '>=', start).where('time', '<=', end)
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).
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)
});
const event = new Date();
const expirationDate = admin.firestore.Timestamp.fromDate(event);
const query = collectionRef.where('startTime', '<=', expirationDate)
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 Timestamp
als Date
jedoch wie beschrieben in der Dokumentation hier wird die bald durch ein ersetzt werden Timestamp
Objekt. 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);
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.
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;
})
In einer Frontend-Anwendung können Firebase-Zeitstempel und -Daten auf diese Weise zum Abfragen und Speichern von Dokumenten verwendet werden.
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;