Firestore im nativen Modus besteht aus zwei Arten von Vorgängen: Firestore-Kernvorgängen und Firestore-Pipelinevorgängen.
Die Firestore-Kernvorgänge bieten die Standardfunktionen zum Erstellen, Lesen, Aktualisieren und Löschen von Dokumenten (CRUD) sowie integrierte Unterstützung für Echtzeit-Listenabfragen und Offlinepersistenz. Ein wesentlicher Unterschied in dieser Version besteht darin, dass Indexe optional sind und nicht automatisch für einzelne Felder erstellt werden. Dadurch können Abfragen ohne vorherige Indexkonfiguration ausgeführt werden. Bei nicht indexierten Abfragen wird standardmäßig die gesamte Sammlung gescannt. Mit zunehmender Größe des Datasets kann dies zu einer höheren Latenz und höheren Kosten führen.
Die Firestore-Pipelinevorgänge sind eine zentrale Funktion der Firestore Enterprise-Version, die auf einer erweiterten Abfrage-Engine basiert, um den Bereich der möglichen Abfragen erheblich zu erweitern. Pipelinevorgänge verwenden eine flexible Abfragesyntax und eine spezielle Indexierungsmethode, bei der Indexe optional sind und nicht automatisch erstellt werden. Dadurch werden erweiterte Datenabrufvorgänge für Anwendungen ermöglicht.
Funktionen von Firestore-Kernvorgängen
Die Gacklaxiekern-Vorgänge ermöglichen Standard-CRUD-Vorgänge und Echtzeit-Listenabfragen. Wenn Sie diese Vorgänge in der Enterprise-Version verwenden, ändert sich das zugrunde liegende Verhalten in Bezug auf Indexierung und Abrechnung im Vergleich zur Standard-Version jedoch erheblich.
Funktionalität und Kontinuität
Bei Kernvorgängen bleibt die bekannte Methodenkettensyntax (z. B. .where(), .orderBy()) erhalten, die in der Standard-Version verwendet wird. Diese Vorgänge unterstützen Echtzeit-Listenabfragen und Offlinepersistenz für Mobil- und Webclients. Es wird empfohlen, diese Vorgänge für standardmäßige Transaktionsarbeitslasten, einfache Suchvorgänge und die Migration von vorhandenem Anwendungscode zu verwenden.
Benutzerdefinierte Indexierung
Im Gegensatz zur Standard-Version werden bei Kernvorgängen in der Enterprise-Version keine Indexe für einzelne Felder automatisch erstellt. Indexe sind optional und nicht erforderlich, um eine Abfrage auszuführen. Wenn ein bestimmter Index fehlt, wird bei der Abfrage eine vollständige Sammlung gescannt. Nicht indexierte Abfragen ermöglichen zwar ein schnelles Prototyping, können aber mit zunehmender Größe des Datasets langsamer und teurer werden. Entwickler müssen Indexe manuell erstellen, um die Abfrageleistung zu optimieren und den Verbrauch von Leseeinheiten zu reduzieren.
Abrechnungsmodell (einheitenbasiert)
Leseeinheiten werden in 4-KB-Tranchen und nicht pro Dokument berechnet. Bei einer nicht indexierten Abfrage, die eine große Sammlung scannt, werden Leseeinheiten basierend auf der Gesamtzahl der gescannten Byte in allen Dokumenten verbraucht. Schreibeinheiten werden in 1-KB-Tranchen berechnet. Beim Schreiben eines Dokuments werden Einheiten für die Daten sowie zusätzliche Einheiten für jeden aktualisierten Indexeintrag verbraucht. Im Gegensatz zur Standard-Version, bei der die automatische Indexierung einzelner Felder erzwungen wird, können Sie jetzt bestimmte Felder für die Indexierung auswählen, um die Schreibkosten und -leistung zu optimieren.
Funktionen von Firestore-Pipelinevorgängen
Die Firestore Enterprise-Version mit Pipelinevorgängen verwendet eine erweiterte Abfrage-Engine, mit der viele bestehende Einschränkungen der Firestore Standard-Version aufgehoben werden. Pipelinevorgänge bieten Hunderte zusätzlicher Abfragefunktionen. Die Pipelinevorgänge haben die folgenden Funktionen:
Stufenbasierte zusammensetzbare Syntax
Pipelineabfragen werden durch Definieren einer Reihe sequenzieller Stufen erstellt, die in der Reihenfolge ausgeführt werden. Dadurch sind komplexe Vorgänge möglich, z. B. das Filtern nach dem Ergebnis einer Aggregation, was bisher nicht möglich war.
Das folgende Beispiel zeigt eine Pipelineabfrage, mit der die Anzahl der eindeutigen Produkt-IDs ermittelt wird, die im letzten Monat angesehen wurden:
guard let cutoffDate = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else {
return
}
let snapshot = try await db.pipeline()
.collection("productViews")
.where(Field("viewedAt").greaterThan(cutoffDate.timeIntervalSince1970))
.aggregate([Field("productId").countDistinct().as("uniqueProductViews")])
.execute()
Erweiterte Funktionen
Die Pipelineabfrage bietet eine Vielzahl neuer Funktionen, darunter:
- Aggregationen: Unterstützung für neue Aggregatfunktionen wie
sum(...),min(...)undcount_distinct(...)in Kombination mit beliebigen Gruppierungsfeldern. - Relationale Joins: Führen Sie serverseitige Joins für Sammlungen und Untersammlungen mit korrelierten Unterabfragen aus.
- Komplexes Filtern: Unterstützung für Hunderte zusätzlicher Funktionen, um beliebig komplexe
where(...)-Anweisungen auszudrücken, einschließlichregex_match(...),add(...)undstr_contains(...), ohne dass strenge Indexanforderungen gelten. - Teilweise Lesevorgänge / Projektionen: Rufen Sie dynamische Teilmengen von Dokumenten mit
select(...),remove_fields(...)und vielen anderen Stufen zur Dokumentbearbeitung ab.
Weitere Informationen zu diesen Funktionen finden Sie unter Daten mit Pipeline vorgängen abfragen.
Echtzeit- und Offlineunterstützung
Um Echtzeit- und Offlinefunktionen zu nutzen, können Entwickler die Firestore-Kernvorgänge in der Firestore Enterprise-Version verwenden.
Client- und Toolintegration
Die Enterprise-Version enthält spezielle Funktionen für die Interaktion mit Pipelineabfragen und deren Verwaltung:
- Abfrageerklärung und -profilerstellung:Mit den Ergebnissen von Query Explain können Sie nachvollziehen, wie viele Lese- oder Schreibeinheiten eine Abfrage verbraucht, und die Ausführung analysieren.
- Abfragestatistiken : Die Enterprise-Version unterstützt Query Insights. Damit können Sie ermitteln, wo Indexe erstellt werden könnten, um Leistung und Kosten zu verbessern. Sie erhalten Einblick in die wichtigsten Abfragen, die in Ihrer Datenbank ausgeführt werden, und in ihre Leistungsmerkmale.
- Neue Indexarten: Sie können spezielle Indexe für die Enterprise-Version erstellen, einschließlich Indexarten wie Sparse-, Non-Sparse- und Unique-Indexe. Außerdem können Sie Vektorsuchindexe für Enterprise-Datenbanken erstellen und bearbeiten.
Unterschiede zwischen der Firestore Standard- und der Firestore Enterprise-Version
Der wesentliche betriebliche Unterschied zwischen den Kernvorgängen und den Pipelinevorgängen liegt in der Verwaltung der Indexierung, die sich direkt auf Leistung und Kosten auswirkt.
| Standard-Version – Kernvorgänge | Enterprise-Version – Kernvorgänge und Pipelinevorgänge | |
| Anforderung an die Indexierung | Für Abfragen sind Indexe erforderlich.
Indexe für einzelne Felder werden automatisch erstellt. Komplexere Abfragen basieren auf zusammengesetzten Indexen oder Sammlungsgruppenindexen, die manuell konfiguriert werden müssen. |
Indexe sind nicht erforderlich und daher optional für Abfragen.
Sie definieren Indexe nach Bedarf. Die Enterprise-Version unterstützt auch eine größere Auswahl an Indexarten, darunter Non-Sparse-, Sparse- und Unique-Indexe. |
| Indexierte Felder | Wenn noch nicht vorhanden, wird den indexierten Feldern automatisch ein zusätzliches Feld __name__ angehängt. | __name__ wird nicht automatisch an die indexierten Felder angehängt. Sie müssen __name__ explizit in den indexierten Feldern angeben, wenn es für Ihre Anwendung wichtig ist. |
| Normalisierung der Sortierreihenfolge | Die „Sortieren nach“-Klausel der Abfrage wird normalisiert, indem am Ende Ungleichheitsfelder und das __name__ Feld angehängt werden (falls noch nicht vorhanden). Dadurch wird eine eindeutige, deterministische Sortierung der Ergebnisse garantiert, unabhängig davon, welche anderen Felder in der „Sortieren nach“-Klausel enthalten sind. | Keine Normalisierung der Sortierreihenfolge. Eine Sortierreihenfolge wie sort a ASC garantiert nur, dass die Ergebnisse nach Feld a sortiert werden. Cloud Firestore verwendet Ihre vorhandenen Indexe, um Ergebnisse in der effizientesten Reihenfolge zurückzugeben. Wenn a im Ergebnissatz also nicht eindeutig ist, kann die Reihenfolge der Ergebnisse je nach Abfrage variieren (je nach Indexkonfiguration, Ausführungsstrategien usw.). Um eine eindeutige, deterministische Sortierung der Ergebnisse zu garantieren, müssen Sie der Sortierreihenfolge ein eindeutiges Feld wie __name__ hinzufügen. |
| Leistung | Indexierte Abfragen:Leistung und Kosten skalieren mit der Größe des Ergebnissatzes. |
Nicht indexierte Abfragen:Leistung und Kosten skalieren mit der Größe des Datasets. Indexierte Abfragen:Leistung und Kosten skalieren mit der Größe des Ergebnissatzes. Wir empfehlen, die Tools Query Explain und Query Insights zu verwenden, um Indexe zu erstellen und die Leistung und Kosten Ihrer Abfragen zu verbessern. |
| Auswirkungen auf die Speicherkosten | Es fallen Speicherkosten für automatische und zusammengesetzte Indexe an. | Sie sparen Speicherkosten, da Indexe nicht automatisch für jedes Feld erstellt werden. |
| Kostengrundlage | Die Kosten werden pro Lese-, Schreib- und Löschvorgang für ein Dokument berechnet. | Die Kosten werden pro Leseeinheit (4-KB-Tranchen) und Schreibeinheit (1-KB-Tranchen) berechnet. Beim Schreiben von Indexeinträgen werden Schreibeinheiten verbraucht.
Informationen zu den neuen Preisen mit einigen Beispielen. |
| Sicherheitsregeln | Sicherheitsregeln schützen Sammlungen, indem sie Lese-/Schreibberechtigungen überprüfen. | Sicherheitsregeln schützen Sammlungen, indem sie Lese-/Schreibberechtigungen überprüfen. Informationen zum Modellieren von Daten zur Unterstützung von Pipeline Abfragen finden Sie im Leitfaden zum Datenmodell. |