Modello dati
Firestore è un database NoSQL orientato ai documenti. A differenza di un database SQL, non ci sono tabelle o righe. Archiviali invece in documenti, che sono organizzati in raccolte.
Ogni documento contiene un insieme 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 entrambi possono includere campi primitivi come stringhe o oggetti complessi come elenchi.
Le raccolte e i documenti vengono creati implicitamente in Firestore. È sufficiente assegnare i dati a un documento all'interno di una raccolta. Se la raccolta o il documento non esiste, Firestore li crea.
Documenti
In Firestore, l'unità di archiviazione è il documento. Un documento è un record leggero che contiene campi mappati a 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 e complessi in un documento sono chiamati mappe. Ad esempio, puoi strutturare il nome dell'utente dell'esempio precedente con una mappa, come segue:
alovelace
name :
first : "Ada"
last : "Lovelace"
born : 1815
Potresti notare che i documenti hanno un aspetto molto simile a JSON. In realtà, lo sono fondamentalmente. Esistono alcune differenze (ad esempio, i documenti supportano tipi di dati aggiuntivi e hanno una dimensione limitata a 1 MB), ma in generale puoi trattare i documenti come record JSON leggeri.
Raccolte
I documenti risiedono in raccolte, che sono semplicemente contenitori di documenti. Ad esempio, potresti avere una raccolta users
contenente i tuoi vari utenti, ciascuno rappresentato da un documento:
utenti
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
Attrazione
first : "Alan"
last : "Turing"
born : 1912
Firestore è senza schema, quindi hai la completa libertà sui campi da inserire in ciascun documento e sui tipi di dati archiviati in tali campi. I documenti all'interno della stessa raccolta possono contenere tutti campi diversi o archiviare tipi di dati diversi in questi campi. Tuttavia, è una buona idea 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 e non può contenere altre raccolte. Per una spiegazione di come strutturare dati più complessi in Firestore, consulta Dati gerarchici.
I nomi dei documenti all'interno di una raccolta sono univoci. Puoi fornire le tue chiavi, ad esempio gli ID utente, oppure puoi consentire a Firestore di creare ID casuali per te automaticamente.
Non è necessario "creare" o "eliminare" le raccolte. Dopo aver creato il primo documento in una raccolta, la raccolta esiste. Se elimini tutti i documenti in 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 località nel codice, puoi creare un riferimento alla località.
Versione web 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+KTX
Android
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Ferretto
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
Python
Python
(asinc)
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Go
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare 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 Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Un riferimento è un oggetto leggero che punta semplicemente a una località nel tuo database. Puoi creare un riferimento indipendentemente dal fatto che esistano o meno dati al suo interno; la creazione di un riferimento non esegue operazioni di rete.
Puoi anche creare riferimenti alle raccolte:
Versione web 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+KTX
Android
val usersCollectionRef = db.collection("users")
Java
Android
CollectionReference usersCollectionRef = db.collection("users");
Ferretto
final usersCollectionRef = db.collection("users");
Java
Python
Python
(asinc)
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Go
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Unity
CollectionReference collectionRef = db.Collection("users");
C#
C#
Per eseguire l'autenticazione in Firestore, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare 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
:
Versione web 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+KTX
Android
val alovelaceDocumentRef = db.document("users/alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Ferretto
final aLovelaceDocRef = db.doc("users/alovelace");
Java
Python
Python
(asinc)
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Go
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Per eseguire l'autenticazione in Firestore, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare 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 stanze virtuali diverse:
stanze
roomA
name : "my chat room"
roomB
...
Ora che disponi di stanze virtuali, decidi come archiviare i tuoi messaggi. Forse non vuoi memorizzarle nel documento della chat room. I documenti in Firestore devono essere leggeri e una stanza virtuale può contenere un numero elevato di messaggi. Tuttavia, puoi creare raccolte aggiuntive all'interno del documento della stanza virtuale, come sottoraccolte.
Sottoraccolte
In questo scenario, il modo migliore per archiviare i messaggi consiste nell'utilizzare le sottoraccolte. Una sottoraccolta è una raccolta associata a un documento specifico.
Puoi creare una sottoraccolta denominata messages
per ogni documento della stanza
nella tua raccolta rooms
:
stanze
roomA
name : "my chat room"
messaggi
message1
from : "alex"
msg : "Hello World!"
message2
...
roomB
...
In questo esempio, devi creare un riferimento a un messaggio nella sottoraccolta con il seguente codice:
Versione web 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+KTX
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");
Ferretto
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
Java
Python
Python
(asinc)
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Go
PHP
PHP
Per eseguire l'autenticazione in Firestore, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare 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 Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Nota il pattern alternato di raccolte e documenti. Le raccolte e i documenti devono sempre seguire questo schema. Non puoi fare riferimento a una raccolta in una raccolta o a un documento in un documento.
Le sottoraccolte consentono di strutturare i dati in modo gerarchico, semplificando l'accesso. Per ricevere tutti i messaggi in roomA
, puoi creare un riferimento alla raccolta
per la sottoraccolta messages
e interagire con esso come faresti con qualsiasi altro
riferimento alla raccolta.
I documenti nelle sottoraccolte possono contenere anche sottoraccolte, consentendoti di nidificare ulteriormente i dati. Puoi nidificare i dati fino a 100 livelli di profondità.