Modello dei dati
Firestore è un database NoSQL orientato ai documenti. A differenza di un database SQL, non ci sono tabelle o righe. I dati vengono invece archiviati in documenti, organizzati in raccolte.
Ogni documento contiene una serie di coppie chiave-valore. Firestore è ottimizzato per l'archiviazione di grandi raccolte di documenti di piccole dimensioni.
Tutti i documenti devono essere archiviati in raccolte. I documenti possono contenere sottoraccolte e oggetti nidificati, che possono includere campi primitivi come stringhe o oggetti complessi come elenchi.
Le raccolte e i documenti vengono creati in modo implicito in Firestore. Basta assegnare i dati a un documento all'interno di una raccolta. Se la raccolta o il documento non esiste, Firestore lo crea.
Documenti
In Firestore, l'unità di archiviazione è il documento. Un documento è un record leggero che contiene campi, che vengono mappati ai valori. Ogni documento è identificato da un nome.
Un documento che rappresenta un utente alovelace potrebbe avere il seguente aspetto:
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
Gli oggetti nidificati complessi in un documento sono chiamati mappe. Ad esempio, puoi strutturare il nome dell'utente dell'esempio precedente con una mappa, in questo modo:
alovelace
name :
first : "Ada"
last : "Lovelace"
born : 1815
Potresti notare che i documenti assomigliano molto a JSON. In effetti, sono praticamente la stessa cosa. Esistono alcune differenze (ad esempio, i documenti supportano tipi di dati aggiuntivi e sono limitati al limite di dimensione del documento), ma in generale puoi trattare i documenti come record JSON leggeri.
Raccolte

I documenti si trovano nelle raccolte, che sono contenitori per i documenti. Ad esempio, potresti avere una raccolta users contenente i vari utenti, ciascuno rappresentato da un documento:
utenti
alovelace
first : "Ada"
last : "Lovelace"
born : 1815aturing
first : "Alan"
last : "Turing"
born : 1912
Firestore è privo di schema, quindi hai la massima libertà sui campi da inserire in ogni documento e sui tipi di dati da archiviare in questi campi. I documenti all'interno della stessa raccolta possono contenere campi diversi o archiviare tipi di dati diversi in questi campi. Tuttavia, è consigliabile utilizzare gli stessi campi e tipi di dati in più documenti, in modo da poter eseguire query sui documenti più facilmente.
Una raccolta contiene documenti e nient'altro. Non può contenere direttamente campi non elaborati con valori, né altre raccolte. (Consulta Dati gerarchici per una spiegazione su come strutturare dati più complessi in Firestore.)
I nomi dei documenti all'interno di una raccolta sono univoci. Puoi fornire le tue chiavi, ad esempio gli ID utente, o lasciare che Firestore crei automaticamente ID casuali per te.
Non è necessario "creare" o "eliminare" le raccolte. Dopo aver creato il primo documento in una raccolta, la raccolta esiste. Se elimini tutti i documenti di una raccolta, questa non esiste più.
Riferimenti
Ogni documento in Firestore è identificato in modo univoco dalla sua posizione all'interno del database. L'esempio precedente mostrava un documento alovelace all'interno della raccolta users. Per fare riferimento a questa posizione nel codice, puoi creare un
riferimento.
Web version 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
Versione web 8
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
FIRDocumentReference *alovelaceDocumentRef = [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
Kotlin
Android
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Dart
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
Python
Python
(Async)
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Vai
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Ruby
Un riferimento è un oggetto leggero che punta semplicemente a una posizione nel tuo database. Puoi creare un riferimento indipendentemente dalla presenza o meno di dati e la creazione di un riferimento non esegue alcuna operazione di rete.
Puoi anche creare riferimenti alle raccolte:
Web version 9
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Versione web 8
var usersCollectionRef = db.collection('users');
Swift
let usersCollectionRef = db.collection("users")
Objective-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Kotlin
Android
val usersCollectionRef = db.collection("users")
Java
Android
CollectionReference usersCollectionRef = db.collection("users");
Dart
final usersCollectionRef = db.collection("users");
Java
Python
Python
(Async)
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Vai
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Unity
CollectionReference collectionRef = db.Collection("users");
C#
C#
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per praticità, puoi anche creare riferimenti specificando il percorso di un documento o di una raccolta come stringa, con i componenti del percorso separati da una barra (/). Ad esempio, per creare un riferimento al documento alovelace:
Web version 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Versione web 8
var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
FIRDocumentReference *aLovelaceDocumentReference = [self.db documentWithPath:@"users/alovelace"];
Kotlin
Android
val alovelaceDocumentRef = db.document("users/alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Dart
final aLovelaceDocRef = db.doc("users/alovelace");
Java
Python
Python
(Async)
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Vai
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Ruby
Dati gerarchici
Per capire come funzionano le strutture di dati gerarchiche in Firestore, prendi in considerazione un'app di chat di esempio con messaggi e stanze virtuali.
Puoi creare una raccolta denominata rooms per archiviare diverse stanze virtuali:
stanze
stanzaA
name : "my chat room"roomB
...
Ora che hai le stanze virtuali, decidi come archiviare i messaggi. Potresti non volerli archiviare nel documento della stanza virtuale. I documenti in Firestore devono essere leggeri e una stanza virtuale potrebbe contenere un numero elevato di messaggi. Tuttavia, puoi creare raccolte aggiuntive all'interno del documento della stanza virtuale, come sottoraccolte.
Sottoraccolte
Il modo migliore per archiviare i messaggi in questo scenario è utilizzare le raccolte secondarie. Una sottoraccolta è una raccolta associata a un documento specifico.
Puoi creare una sottoraccolta denominata messages per ogni documento della stanza nella raccolta rooms:
stanze
stanzaA
name : "my chat room"messaggi
message1
from : "alex"
msg : "Hello World!"message2
...
roomB
...
In questo esempio, creeresti un riferimento a un messaggio nella raccolta secondaria con il seguente codice:
Web version 9
import { doc } from "firebase/firestore"; const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
Versione web 8
var messageRef = db.collection('rooms').doc('roomA') .collection('messages').doc('message1');
Swift
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Objective-C
FIRDocumentReference *messageRef = [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"] collectionWithPath:@"messages"] documentWithPath:@"message1"];
Kotlin
Android
val messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Java
Android
DocumentReference messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1");
Dart
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
Java
Python
Python
(Async)
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Vai
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Unity
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Per eseguire l'autenticazione in Firestore, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.
Ruby
Nota il pattern alternato di raccolte e documenti. Le tue raccolte e i tuoi documenti devono sempre seguire questo schema. Non puoi fare riferimento a una raccolta in una raccolta o a un documento in un documento.
Le raccolte secondarie ti consentono di strutturare i dati in modo gerarchico, semplificandone l'accesso. Per recuperare tutti i messaggi in roomA, puoi creare un riferimento alla raccolta secondaria messages e interagire con questo riferimento come faresti con qualsiasi altro riferimento alla raccolta.
Anche i documenti nelle sottoraccolte possono contenere sottoraccolte, il che ti consente di nidificare ulteriormente i dati. Puoi nidificare i dati fino a 100 livelli di profondità.
Gruppi di raccolte
Un gruppo di raccolte è costituito da tutte le raccolte di un database che condividono lo stesso ID raccolta, indipendentemente dalla loro posizione nella gerarchia dei documenti. Sono incluse sia le raccolte a livello principale sia le sottoraccolte nidificate a qualsiasi profondità.
Ad esempio, se il tuo database ha una raccolta messages a livello di root e sia roomA che roomB nella raccolta rooms contengono anche sottoraccolte messages, tutte le seguenti appartengono al gruppo di raccolte messages:
messagesrooms/roomA/messagesrooms/roomB/messages
Per impostazione predefinita, le query recuperano i risultati da una singola raccolta. Per recuperare contemporaneamente i documenti di tutte le raccolte di un gruppo di raccolte, utilizza le query dei gruppi di raccolte.