Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Modello di dati Cloud Firestore

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Cloud Firestore è un database NoSQL orientato ai documenti. A differenza di un database SQL, non ci sono tabelle o righe. Al contrario, memorizzi i dati 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 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 esistono, Cloud Firestore lo crea.

Documenti

In Cloud Firestore, l'unità di archiviazione è il documento. Un documento è un record leggero che contiene campi, che corrispondono a valori. Ogni documento è identificato da un nome.

Un documento che rappresenta un utente alovelace potrebbe assomigliare a questo:

  • amore

    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, come questa:

  • amore

    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 una dimensione limitata a 1 MB), ma in generale puoi trattare i documenti come record JSON leggeri.

Collezioni

I documenti risiedono in raccolte, che sono semplicemente contenitori di documenti. Ad esempio, potresti avere una raccolta users per contenere i tuoi vari utenti, ognuno rappresentato da un documento:

  • utenti

    • amore

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • invecchiamento

      first : "Alan"
      last : "Turing"
      born : 1912

Cloud Firestore è senza schema, quindi hai completa libertà su quali campi inserisci in ogni documento e quali tipi di dati memorizzi in quei campi. I documenti all'interno della stessa raccolta possono contenere tutti campi diversi o memorizzare diversi tipi di dati in quei campi. Tuttavia, è una buona idea utilizzare gli stessi campi e tipi di dati su più documenti, in modo da poter interrogare i documenti più facilmente.

Una collezione 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, come 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 in 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 degli users della raccolta. Per fare riferimento a questa posizione nel codice, puoi creare un riferimento ad essa.

Web version 9

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Veloce
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Obiettivo-C
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Giava
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Pitone
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
andare
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('alovelace');
Unità
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Rubino
document_ref = firestore.col("users").doc("alovelace")

Un riferimento è un oggetto leggero che punta semplicemente a una posizione nel database. È possibile creare un riferimento indipendentemente dal fatto che esistano o meno dati lì e la creazione di un riferimento non esegue alcuna operazione di rete.

Puoi anche creare riferimenti a raccolte :

Web version 9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');

Web version 8

var usersCollectionRef = db.collection('users');
Veloce
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
let usersCollectionRef = db.collection("users")
Obiettivo-C
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

CollectionReference usersCollectionRef = db.collection("users");

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

final usersCollectionRef = db.collection("users");
Giava
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Pitone
users_ref = db.collection(u'users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
andare
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
Unità
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
Rubino
collection_ref = firestore.col "users"

Per comodità, 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');

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Veloce
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Obiettivo-C
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
Giava
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Pitone
a_lovelace_ref = db.document(u'users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
andare
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/alovelace');
Unità
DocumentReference documentRef = db.Document("users/alovelace");
C#
DocumentReference documentRef = db.Document("users/alovelace");
Rubino
document_path_ref = firestore.doc "users/alovelace"

Dati gerarchici

Per capire come funzionano le strutture dati gerarchiche in Cloud Firestore, considera un'app di chat di esempio con messaggi e chat room.

È possibile creare una raccolta denominata rooms per archiviare diverse chat room:

  • stanze

    • A

      name : "my chat room"

    • B

      ...

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 gran numero di messaggi. Tuttavia, puoi creare raccolte aggiuntive all'interno del documento della tua chat room, come sottoraccolte.

Sottoraccolte

Il modo migliore per archiviare i messaggi in questo scenario consiste nell'usare sottoraccolte. Una sottoraccolta è una raccolta associata a un documento specifico.

È possibile creare una sottoraccolta denominata messages per ogni documento della sala nella raccolta delle rooms :

  • stanze

    • A

      name : "my chat room"

      • messaggi

        • messaggio

          from : "alex"
          msg : "Hello World!"

        • messaggio

          ...

    • B

      ...

In questo esempio, creeresti un riferimento a un messaggio nella sottoraccolta con il codice seguente:

Web version 9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

Web version 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Veloce
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Obiettivo-C
Nota: questo prodotto non è disponibile sui target watchOS e App Clip.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
Giava
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Pitone
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

Python

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
C++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
Node.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
andare
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Unità
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Rubino
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Notare 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 oa 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 di raccolta ai messages di sottoraccolta e interagire con esso come faresti con qualsiasi altro riferimento di raccolta.

I documenti nelle sottoraccolte possono contenere anche sottoraccolte, consentendoti di nidificare ulteriormente i dati. Puoi annidare dati fino a 100 livelli di profondità.