Cloud 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 , che sono organizzati in raccolte .
Ogni documento contiene una serie di coppie chiave-valore. Cloud Firestore è ottimizzato per l'archiviazione di grandi raccolte di piccoli documenti.
Tutti i documenti devono essere archiviati in raccolte. I documenti possono contenere sottoraccolte e oggetti nidificati, entrambi i quali possono includere campi primitivi come stringhe o oggetti complessi come elenchi.
Raccolte e documenti vengono creati implicitamente in Cloud Firestore. Assegna semplicemente i dati a un documento all'interno di una raccolta. Se la raccolta o il documento non esiste, Cloud Firestore lo crea.
Documenti
In Cloud Firestore, l'unità di archiviazione è il documento. Un documento è un record leggero che contiene campi associati a valori. Ogni documento è identificato da un nome.
Un documento che rappresenta un utente alovelace
potrebbe assomigliare a questo:
first : "Ada"
last : "Lovelace"
born : 1815
Gli oggetti complessi e nidificati in un documento sono chiamati mappe. Ad esempio, potresti strutturare il nome dell'utente dall'esempio sopra con una mappa, in questo modo:
name :
first : "Ada"
last : "Lovelace"
born : 1815
Potresti notare che i documenti assomigliano molto a JSON. In effetti, fondamentalmente lo sono. Esistono alcune differenze (ad esempio, i documenti supportano tipi di dati aggiuntivi e hanno dimensioni limitate a 1 MB), ma in generale è possibile trattare i documenti come record JSON leggeri.
Collezioni
I documenti vivono in raccolte, che sono semplicemente contenitori di documenti. Ad esempio, potresti avere una raccolta users
per contenere i vari utenti, ciascuno rappresentato da un documento:
first : "Ada"
last : "Lovelace"
born : 1815
lezione in
first : "Alan"
last : "Turing"
born : 1912
Cloud Firestore è senza schema, quindi hai completa libertà su quali campi inserire in ciascun documento e quali tipi di dati archiviare in tali campi. I documenti all'interno della stessa raccolta possono contenere tutti campi diversi o archiviare diversi tipi di dati in tali 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 e non può contenere altre raccolte. (Vedi Dati gerarchici per una spiegazione su come strutturare dati più complessi in Cloud Firestore.)
I nomi dei documenti all'interno di una raccolta sono univoci. Puoi fornire le tue chiavi, ad esempio gli ID utente, oppure lasciare che Cloud Firestore crei automaticamente ID casuali per te.
Non è necessario "creare" o "eliminare" 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 Cloud 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 ad essa.
Web modular API
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
Web namespaced API
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Veloce
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Obiettivo-C
FIRDocumentReference *alovelaceDocumentRef = [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
Kotlin+KTX
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Dart
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Giava
Pitone
Python
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Andare
PHP
PHP
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Unità
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Rubino
Un riferimento è un oggetto leggero che punta semplicemente a una posizione nel database. È possibile creare un riferimento indipendentemente dal fatto che i dati esistano o meno e la creazione di un riferimento non esegue alcuna operazione di rete.
Puoi anche creare riferimenti alle collezioni :
Web modular API
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Web namespaced API
var usersCollectionRef = db.collection('users');
Veloce
let usersCollectionRef = db.collection("users")
Obiettivo-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Kotlin+KTX
val usersCollectionRef = db.collection("users")
Java
CollectionReference usersCollectionRef = db.collection("users");
Dart
final usersCollectionRef = db.collection("users");
Giava
Pitone
Python
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Andare
PHP
PHP
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Unità
CollectionReference collectionRef = db.Collection("users");
C#
C#
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Rubino
Per comodità, puoi anche creare riferimenti specificando il percorso di un documento o di una raccolta come una stringa, con i componenti del percorso separati da una barra ( /
). Ad esempio, per creare un riferimento al documento alovelace
:
Web modular API
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Web namespaced API
var alovelaceDocumentRef = db.doc('users/alovelace');
Veloce
let aLovelaceDocumentReference = db.document("users/alovelace")
Obiettivo-C
FIRDocumentReference *aLovelaceDocumentReference = [self.db documentWithPath:@"users/alovelace"];
Kotlin+KTX
val alovelaceDocumentRef = db.document("users/alovelace")
Java
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Dart
final aLovelaceDocRef = db.doc("users/alovelace");
Giava
Pitone
Python
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Andare
PHP
PHP
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Unità
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Rubino
Dati gerarchici
Per comprendere come funzionano le strutture di dati gerarchiche in Cloud Firestore, considera un'app di chat di esempio con messaggi e chat room.
Puoi creare una raccolta denominata rooms
per archiviare diverse chat room:
name : "my chat room"
...
Ora che hai le chat room, decidi come archiviare i tuoi messaggi. Potresti non volerli archiviare nel documento della chat room. I documenti in Cloud Firestore dovrebbero essere leggeri e una chat room potrebbe contenere un numero elevato di messaggi. Tuttavia, puoi creare raccolte aggiuntive all'interno del documento della chat room, come sottoraccolte.
Sottoraccolte
Il modo migliore per archiviare i messaggi in questo scenario consiste nell'utilizzare le sottoraccolte. Una sottoraccolta è una raccolta associata a un documento specifico.
Puoi creare una sottoraccolta chiamata messages
per ogni documento della stanza nella tua raccolta rooms
:
name : "my chat room"
messaggio
from : "alex"
msg : "Hello World!"
messaggio
...
...
In questo esempio, creerai un riferimento a un messaggio nella sottoraccolta con il seguente codice:
Web modular API
import { doc } from "firebase/firestore"; const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
Web namespaced API
var messageRef = db.collection('rooms').doc('roomA') .collection('messages').doc('message1');
Veloce
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Obiettivo-C
FIRDocumentReference *messageRef = [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"] collectionWithPath:@"messages"] documentWithPath:@"message1"];
Kotlin+KTX
val messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Java
DocumentReference messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1");
Dart
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
Giava
Pitone
Python
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Andare
PHP
PHP
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Unità
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Per ulteriori informazioni sull'installazione e sulla creazione di un client Cloud Firestore, fare riferimento a Librerie client Cloud Firestore .
Rubino
Si noti lo schema alternato di raccolte e documenti. Le tue collezioni e i tuoi documenti devono sempre seguire questo schema. Non è possibile 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, facilitando l'accesso ai dati. Per ottenere tutti i messaggi in roomA
, puoi creare un riferimento alla raccolta ai messages
della sottoraccolta e interagire con esso come faresti con qualsiasi altro riferimento alla raccolta.
I documenti nelle sottoraccolte possono contenere anche sottoraccolte, consentendo di nidificare ulteriormente i dati. È possibile annidare i dati fino a 100 livelli di profondità.