Panoramica di Firestore in modalità Native

Firestore in modalità Native è costituito da due insiemi di operazioni: operazioni Firestore Core e operazioni Firestore Pipeline.

Le operazioni di base di Firestore forniscono le funzionalità standard di creazione, lettura, aggiornamento ed eliminazione (CRUD) dei documenti, oltre al supporto integrato per le query di ascolto in tempo reale e la persistenza offline. Una differenza operativa evidente in questa versione è che gli indici sono facoltativi e non vengono creati automaticamente per i singoli campi. In questo modo, le query possono essere eseguite senza una configurazione dell'indice preliminare, ma per impostazione predefinita le query non indicizzate eseguiranno la scansione dell'intera raccolta. Ciò può comportare un aumento della latenza e dei costi man mano che il set di dati cresce.

Le operazioni di Firestore Pipeline sono una funzionalità centrale della versione Firestore Enterprise, basata su un motore di query avanzato per espandere in modo significativo la gamma di query possibili. Le operazioni della pipeline utilizzano una sintassi di query flessibile e un metodo di indicizzazione distinto in cui gli indici sono facoltativi e non vengono creati automaticamente, consentendo operazioni di recupero dei dati avanzate per le applicazioni.

Funzionalità delle operazioni di base di Firestore

Le operazioni di base consentono operazioni CRUD standard e query di ascolto in tempo reale. Tuttavia, quando utilizzi queste operazioni nella versione Enterprise, il comportamento sottostante relativo all'indicizzazione e alla fatturazione cambia in modo significativo rispetto alla versione Standard.

Funzionalità e continuità

Le operazioni principali mantengono la sintassi di concatenamento dei metodi familiare (ad esempio .where(), .orderBy()) utilizzata nella versione Standard. Queste operazioni supportano query di ascolto in tempo reale e persistenza offline per i client mobile e web. Ti consigliamo di utilizzare queste operazioni per workload transazionali standard, ricerche semplici e migrazione del codice dell'applicazione esistente.

Indicizzazione personalizzata

A differenza della versione Standard, le operazioni di base nella versione Enterprise non creano automaticamente indici a campo singolo. Gli indici sono facoltativi e non sono obbligatori per eseguire una query. Se manca un indice specifico, la query esegue una scansione completa della raccolta. Sebbene le query non indicizzate consentano una rapida prototipazione, potrebbero essere più lente e costose man mano che il set di dati cresce. Gli sviluppatori devono creare manualmente gli indici per ottimizzare le prestazioni delle query e ridurre il consumo di unità di lettura.

Modello di fatturazione (basato su unità)

Le unità di lettura vengono addebitate in tranche da 4 KB anziché in base al numero di documenti. Una query non indicizzata che analizza una raccolta di grandi dimensioni consumerà unità di lettura in base ai byte totali analizzati in tutti i documenti. Le unità di scrittura vengono addebitate in tranche da 1 KB. La scrittura di un documento consuma unità per i dati più unità aggiuntive per ogni voce di indice aggiornata. A differenza della versione Standard, che applica l'indicizzazione automatica a campo singolo, ora puoi scegliere campi specifici da indicizzare per ottimizzare i costi di scrittura e le prestazioni.

Funzionalità delle operazioni della pipeline di Firestore

La versione Firestore Enterprise con operazioni di pipeline utilizza un motore di query avanzato che rimuove molte limitazioni esistenti della versione Firestore Standard. Le operazioni di pipeline forniscono centinaia di funzionalità di query aggiuntive. Le operazioni della pipeline hanno le seguenti funzionalità:

Sintassi componibile basata sulle fasi

Le query della pipeline vengono create definendo una serie di fasi sequenziali che vengono eseguite in ordine. In questo modo è possibile eseguire operazioni complesse, come il filtro sul risultato di un'aggregazione, cosa che prima non era possibile.

L'esempio seguente mostra una query della pipeline che trova il numero di ID prodotto univoci visualizzati nell'ultimo mese:

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

Funzionalità ampliate

La query Pipeline introduce un gran numero di nuove funzionalità, tra cui:

  • Aggregazioni: supporto di nuove funzioni di aggregazione (come sum(...), min(...) e count_distinct(...)) combinate con campi di raggruppamento arbitrari.
  • Join relazionali: esegui join lato server tra raccolte e sottoraccolte utilizzando sottoquery correlate.
  • Filtri complessi: supporto di centinaia di funzioni aggiuntive per esprimere istruzioni where(...) arbitrariamente complesse, tra cui regex_match(...), add(...) e str_contains(...), il tutto senza requisiti di indicizzazione rigidi.
  • Letture parziali / proiezioni: recupera sottoinsiemi dinamici di documenti utilizzando select(...), remove_fields(...) e molte altre fasi di manipolazione dei documenti.

Per scoprire di più su queste funzionalità, consulta Esegui query sui dati con le operazioni della pipeline.

Supporto in tempo reale e offline

Per utilizzare Realtime e Offline, gli sviluppatori possono utilizzare le operazioni di base di Firestore nella versione Firestore Enterprise.

Integrazione di client e strumenti

La versione Enterprise include funzionalità specializzate per interagire con le query di Pipeline e gestirle:

  • Spiegazione e profilazione delle query: È possibile utilizzare i risultati di Query Explain per capire quante unità di lettura o scrittura consuma una query e analizzarne l'esecuzione.
  • Query Insights: la versione Enterprise supporta Query Insights, che ti aiuta a determinare dove creare gli indici per migliorare le prestazioni e i costi, fornendo visibilità sulle query principali eseguite sul tuo database e sulle relative caratteristiche di prestazioni
  • Nuovi tipi di indici: puoi creare indici specializzati per la versione Enterprise, inclusi tipi di indici come indici sparsi, non sparsi e univoci. Supporta anche la creazione e la modifica di indici di ricerca vettoriale per i database Enterprise.

Differenze tra Firestore Standard edition e Firestore Enterprise edition

La principale differenza operativa tra le operazioni di base e quelle della pipeline risiede nella gestione dell'indicizzazione, che influisce direttamente sulle prestazioni e sui costi.

Versione Standard - Operazioni di base Versione Enterprise - Operazioni di base e operazioni della pipeline
Requisito di indicizzazione Gli indici sono obbligatori per le query.

Gli indici per i singoli campi vengono creati automaticamente, mentre le query più complesse si basano su indici composti o indici di gruppi di raccolte che devono essere configurati manualmente.

Gli indici non sono obbligatori e, pertanto, sono facoltativi per le query.

Gli indici vengono definiti in base alle esigenze. La versione Enterprise supporta anche una gamma più ampia di tipi di indici, tra cui indici non sparsi/sparsi e univoci.

Campi indicizzati Se non è già presente, ai campi indicizzati viene aggiunto automaticamente un campo __name__ aggiuntivo. __name__ non viene aggiunto automaticamente ai campi indicizzati. Se è importante per la tua applicazione, devi specificare esplicitamente __name__ nei campi indicizzati.
Normalizzazione dell'ordinamento La clausola ORDER BY della query viene normalizzata aggiungendo i campi di disuguaglianza e il campo __name__ alla fine (se non sono già presenti). In questo modo, viene garantito un ordinamento univoco e deterministico dei risultati, indipendentemente dagli altri campi presenti nella clausola order by. Nessuna normalizzazione dell'ordinamento. Un ordinamento come sort a ASC garantisce solo che i risultati siano ordinati in base al campo a. Cloud Firestore utilizzerà gli indici esistenti per restituire i risultati nell'ordine più efficiente possibile. Pertanto, se a non è univoco nel set di risultati, l'ordine dei risultati può variare da una query all'altra a seconda della configurazione dell'indice, delle strategie di esecuzione e così via. Per garantire un ordinamento univoco e deterministico dei risultati, devi aggiungere un campo univoco come __name__ all'ordinamento.
Prestazioni Query indicizzate: le prestazioni e i costi scalano in base alle dimensioni del set di risultati.

Query non indicizzate: le prestazioni e i costi scalano in base alle dimensioni del set di dati.

Query indicizzate: le prestazioni e i costi scalano in base alle dimensioni del set di risultati.

Ti consigliamo di utilizzare gli strumenti Query Explain e Query Insights per creare indici e migliorare le prestazioni e i costi delle query.

Implicazioni sui costi di archiviazione Gli indici automatici e gli indici composti comportano un overhead di archiviazione. Risparmi sui costi di archiviazione perché gli indici non vengono creati automaticamente per ogni campo.
Base di costo Addebitato per ogni operazione di lettura, scrittura ed eliminazione di documenti. Addebitato per unità di lettura (tranche da 4 KB) e unità di scrittura (tranche da 1 KB). La scrittura delle voci di indice consuma unità di scrittura.

Scopri di più sui nuovi prezzi con alcuni esempi.

Regole di sicurezza Le regole di sicurezza proteggono le raccolte verificando le autorizzazioni di lettura/scrittura. Le regole di sicurezza proteggono le raccolte verificando le autorizzazioni di lettura/scrittura. Scopri come modellare i dati per supportare le query di Pipeline nella guida Modello di dati.