Übersicht über Firestore im nativen Modus

Firestore im nativen Modus besteht aus zwei Arten von Vorgängen: Firestore Core-Vorgänge und Firestore Pipeline-Vorgänge.

Die Firestore Core-Vorgänge bieten die Standardfunktionen zum Erstellen, Lesen, Aktualisieren und Löschen (CRUD) von Dokumenten sowie integrierte Unterstützung für Echtzeit-Abfragen und Offline-Persistenz. Ein wesentlicher Unterschied bei dieser Version besteht darin, dass Indexe optional sind und nicht automatisch für einzelne Felder erstellt werden. So können Abfragen ohne vorherige Indexkonfiguration ausgeführt werden. Bei nicht indexierten Abfragen wird jedoch standardmäßig die gesamte Sammlung gescannt. Dies kann zu einer höheren Latenz und höheren Kosten führen, wenn das Dataset wächst.

Firestore-Pipeline-Vorgänge sind ein zentrales Feature der Firestore Enterprise-Version. Sie basieren auf einer erweiterten Abfrage-Engine, die die Bandbreite möglicher Abfragen erheblich erweitert. Pipeline-Vorgänge verwenden eine flexible Abfragesyntax und eine spezielle Indexierungsmethode, bei der Indexe optional sind und nicht automatisch erstellt werden. Dies ermöglicht erweiterte Datenabrufvorgänge für Anwendungen.

Funktionen von Firestore-Hauptvorgängen

Die Core-Vorgänge ermöglichen standardmäßige CRUD-Vorgänge und Echtzeit-Abfragen. Wenn Sie diese Vorgänge jedoch in der Enterprise-Version verwenden, ändert sich das zugrunde liegende Verhalten in Bezug auf Indexierung und Abrechnung im Vergleich zur Standard-Version erheblich.

Funktionalität und Kontinuität

Bei den Kernvorgängen wird die vertraute Syntax für die Verkettung von Methoden (z. B. .where(), .orderBy()) beibehalten, die in der Standard-Edition verwendet wird. Diese Vorgänge unterstützen Echtzeit-Abfragefunktionen und Offline-Persistenz 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 Core-Vorgängen in der Enterprise-Version nicht automatisch Einzelfeldindexe erstellt. Indexe sind optional und für die Ausführung einer Abfrage nicht erforderlich. Wenn ein bestimmter Index fehlt, wird die Abfrage für die gesamte Sammlung ausgeführt. Nicht indexierte Abfragen ermöglichen zwar ein schnelles Prototyping, können aber langsamer sein und mehr kosten, wenn das Dataset wächst. 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 Dokumentanzahl abgerechnet. 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 abgerechnet. 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 die Leistung zu optimieren.

Funktionen von Firestore-Pipelinevorgängen

Die Firestore Enterprise-Version mit Pipeline-Vorgängen verwendet eine erweiterte Abfrage-Engine, die viele bestehende Einschränkungen der Firestore Standard-Version aufhebt. Pipelinevorgänge bieten Hunderte von zusätzlichen Abfragefunktionen. Pipelinevorgänge bieten die folgenden Funktionen:

Phasenbasierte zusammensetzbare Syntax

Pipeline-Abfragen werden durch die Definition einer Reihe von sequenziellen Phasen erstellt, die nacheinander ausgeführt werden. Dies ermöglicht komplexe Vorgänge, z. B. das Filtern nach dem Ergebnis einer Aggregation, was bisher nicht möglich war.

Das folgende Beispiel zeigt eine Pipeline-Abfrage, mit der die Anzahl der eindeutigen Produkt-IDs ermittelt wird, die im letzten Monat aufgerufen 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 Pipeline-Abfrage bietet eine Vielzahl neuer Funktionen, darunter:

  • Aggregationen: Unterstützung für neue Aggregationsfunktionen (wie sum(...), min(...) und count_distinct(...)) in Kombination mit beliebigen Gruppierungsfeldern.
  • Relationale Joins: Führen Sie serverseitige Joins über Sammlungen und Untersammlungen hinweg mit korrelierten Unterabfragen aus.
  • Komplexe Filterung: Unterstützung für Hunderte zusätzlicher Funktionen, um beliebig komplexe where(...)-Anweisungen auszudrücken, einschließlich regex_match(...), add(...) und str_contains(...), ohne strenge Indexanforderungen.
  • Teilweises Lesen / Projektionen: Rufen Sie dynamische Teilmengen von Dokumenten mit select(...), remove_fields(...) und vielen anderen Phasen der Dokumentbearbeitung ab.

Weitere Informationen zu diesen Funktionen finden Sie unter Daten mit Pipelinevorgängen abfragen.

Echtzeit- und Offline-Unterstützung

Um Echtzeit- und Offline-Funktionen zu nutzen, können Entwickler die Firestore Core-Vorgänge in der Firestore Enterprise-Version verwenden.

Client- und Toolintegration

Die Enterprise-Version enthält spezielle Funktionen für die Interaktion mit Pipeline-Abfragen und deren Verwaltung:

  • Abfrageerklärung und -profilerstellung: Mit den Ergebnissen von Query Explain können Sie nachvollziehen, wie viele Lese- oder Schreibvorgänge eine Abfrage verbraucht, und ihre Ausführung analysieren.
  • Query Insights: Die Enterprise-Version unterstützt Query Insights, mit dem Sie ermitteln können, wo Indexe erstellt werden könnten, um die Leistung und die Kosten zu verbessern. Dazu erhalten Sie Einblick in die wichtigsten Abfragen, die in Ihrer Datenbank ausgeführt werden, und deren Leistungsmerkmale.
  • Neue Indextypen: Sie können spezielle Indizes für die Enterprise-Version erstellen, darunter dünnbesetzte, nicht dünnbesetzte und eindeutige Indizes. Außerdem wird das Erstellen und Bearbeiten von Vektorsuchindizes für Enterprise-Datenbanken unterstützt.

Unterschiede zwischen der Firestore Standard- und der Firestore Enterprise-Version

Der wesentliche operative Unterschied zwischen den Core- und Pipeline-Vorgängen liegt in der Verwaltung der Indexierung, die sich direkt auf die Leistung und die Kosten auswirkt.

Standardversion – Kernvorgänge Enterprise-Version – Kernvorgänge und Pipeline-Vorgänge
Anforderung an die Indexierung Für Abfragen sind Indexe erforderlich.

Indexe für einzelne Felder werden automatisch erstellt. Für komplexere Abfragen sind jedoch zusammengesetzte Indexe oder Indexe für Sammlungsgruppen erforderlich, die manuell konfiguriert werden müssen.

Indexe sind nicht erforderlich und daher für Abfragen optional.

Sie definieren Indexe nach Bedarf. Die Enterprise-Version unterstützt außerdem eine größere Auswahl an Indextypen, darunter dünnbesetzte und nicht dünnbesetzte sowie eindeutige Indizes.

Indexierte Felder Ein zusätzliches __name__-Feld wird automatisch an die indexierten Felder angehängt, falls es noch nicht vorhanden ist. __name__ wird nicht automatisch an die indexierten Felder angehängt. Sie müssen __name__ explizit in den indexierten Feldern angeben, wenn dies für Ihre Anwendung wichtig ist.
Normalisierung der Sortierreihenfolge Die ORDER BY-Klausel der Abfrage wird normalisiert, indem Ungleichheitsfelder und das Feld __name__ am Ende angehängt werden (falls noch nicht vorhanden). Dadurch wird eine eindeutige, deterministische Reihenfolge der Ergebnisse gewährleistet, unabhängig davon, welche anderen Felder in der ORDER BY-Klausel enthalten sind. Keine Normalisierung der Sortierreihenfolge. Eine Sortierreihenfolge wie sort a ASC garantiert nur, dass die Ergebnisse nach dem Feld a sortiert werden. Cloud Firestore verwendet Ihre vorhandenen Indexe, um Ergebnisse in der effizientesten Reihenfolge zurückzugeben. Wenn a in der Ergebnismenge nicht eindeutig ist, kann die Reihenfolge der Ergebnisse je nach Indexkonfiguration, Ausführungsstrategien usw. von Abfrage zu Abfrage variieren. Um eine eindeutige, deterministische Reihenfolge der Ergebnisse zu gewährleisten, 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 Ihres 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 Durch automatische und zusammengesetzte Indexe entsteht ein Speicher-Overhead. Sie sparen Speicherkosten, da nicht für jedes Feld automatisch Indexe erstellt werden.
Kostenbasis Die Abrechnung erfolgt pro Lese-, Schreib- und Löschvorgang für Dokumente. Die Abrechnung erfolgt pro Leseeinheit (4-KB-Tranchen) und Schreibeinheit (1-KB-Tranchen). Das Schreiben von Indexeinträgen verbraucht Schreibeinheiten.

Beispiele für die neuen Preise

Sicherheitsregeln Sicherheitsregeln schützen Sammlungen, indem sie Lese- und Schreibberechtigungen prüfen. Sicherheitsregeln schützen Sammlungen, indem sie Lese- und Schreibberechtigungen prüfen. Informationen zum Modellieren Ihrer Daten zur Unterstützung von Pipeline-Abfragen finden Sie im Leitfaden Datenmodell.