Catch up on everthing we announced at this year's Firebase Summit. Learn more

Modèle de données Cloud Firestore

Cloud Firestore est une base de données NoSQL orientée document. Contrairement à une base de données SQL, il n'y a pas de tables ou de lignes. Au lieu de cela, vous stockez des données dans les documents, qui sont organisés en collections.

Chaque document contient un ensemble de paires valeur clé. Cloud Firestore est optimisé pour stocker de grandes collections de petits documents.

Tous les documents doivent être conservés dans des collections. Les documents peuvent contenir des objets imbriqués et sous - collections, les deux qui peuvent inclure des champs primitifs comme des chaînes ou des objets complexes comme les listes.

Les collections et les documents sont créés implicitement dans Cloud Firestore. Attribuez simplement des données à un document au sein d'une collection. Si la collection ou le document n'existe pas, Cloud Firestore le crée.

Documents

Dans Cloud Firestore, l'unité de stockage est le document. Un document est un enregistrement léger qui contient des champs, qui correspondent à des valeurs. Chaque document est identifié par un nom.

Un document représentant un utilisateur alovelace pourrait ressembler à ceci:

  • alovelace

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

Les objets complexes et imbriqués dans un document sont appelés cartes. Par exemple, vous pouvez structurer le nom de l'utilisateur de l'exemple ci-dessus avec une carte, comme ceci :

  • alovelace

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

Vous remarquerez peut-être que les documents ressemblent beaucoup à JSON. En fait, ils le sont fondamentalement. Il existe quelques différences (par exemple, les documents prennent en charge des types de données supplémentaires et sont limités en taille à 1 Mo), mais en général, vous pouvez traiter les documents comme des enregistrements JSON légers.

Collections

Les documents vivent dans des collections, qui sont simplement des conteneurs pour les documents. Par exemple, vous pourriez avoir un users collection pour contenir vos différents utilisateurs, chacun représenté par un document:

  • utilisateurs

    • alovelace

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

    • aturing

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

Cloud Firestore est sans schéma, vous avez donc une liberté totale sur les champs que vous placez dans chaque document et les types de données que vous stockez dans ces champs. Les documents d'une même collection peuvent tous contenir des champs différents ou stocker différents types de données dans ces champs. Cependant, il est conseillé d'utiliser les mêmes champs et types de données dans plusieurs documents, afin de pouvoir interroger les documents plus facilement.

Une collection contient des documents et rien d'autre. Il ne peut pas contenir directement des champs bruts avec des valeurs, et il ne peut pas contenir d'autres collections. (Voir données hiérarchique pour une explication de la façon de structurer les données plus complexes du Cloud Firestore.)

Les noms des documents d'une collection sont uniques. Vous pouvez fournir vos propres clés, telles que des ID utilisateur, ou vous pouvez laisser Cloud Firestore créer automatiquement des ID aléatoires pour vous.

Vous n'avez pas besoin de « créer » ou de « supprimer » des collections. Une fois que vous avez créé le premier document d'une collection, la collection existe. Si vous supprimez tous les documents d'une collection, celle-ci n'existe plus.

Les références

Chaque document dans Cloud Firestore est identifié de manière unique par son emplacement dans la base de données. L'exemple précédent a montré un document alovelace dans la collection users . Pour faire référence à cet emplacement dans votre code, vous pouvez créer une référence.

Web version 9

import { doc } from "firebase/firestore";

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

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Rapide
Remarque: Ce produit est disponible sur watchos et App cibles de clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objectif c
Remarque: Ce produit est disponible sur watchos et App cibles de 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")
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Python
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');
Aller
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('lovelace');
Unité
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Rubis
document_ref = firestore.col("users").doc("alovelace")

Une référence est un objet léger qui pointe simplement vers un emplacement dans votre base de données. Vous pouvez créer une référence, que des données y existent ou non, et la création d'une référence n'effectue aucune opération de réseau.

Vous pouvez également créer des références à des collections:

Web version 9

import { collection } from "firebase/firestore";

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

Web version 8

var usersCollectionRef = db.collection('users');
Rapide
Remarque: Ce produit est disponible sur watchos et App cibles de clip.
let usersCollectionRef = db.collection("users")
Objectif c
Remarque: Ce produit est disponible sur watchos et App cibles de clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

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

Kotlin+KTX

val usersCollectionRef = db.collection("users")
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
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');
Aller
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
Unité
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
Rubis
collection_ref = firestore.col "users"

Pour plus de commodité, vous pouvez également créer des références en spécifiant le chemin d'accès d' un document ou d'une collection comme une chaîne, avec des composants de chemin séparés par une barre oblique ( / ). Par exemple, pour créer une référence au alovelace document:

Web version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Rapide
Remarque: Ce produit est disponible sur watchos et App cibles de clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objectif c
Remarque: Ce produit est disponible sur watchos et App cibles de clip.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

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

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Python
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');
Aller
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/lovelace');
Unité
DocumentReference documentRef = db.Document("users/alovelace");
C#
DocumentReference documentRef = db.Document("users/alovelace");
Rubis
document_path_ref = firestore.doc "users/alovelace"

Données hiérarchiques

Pour comprendre le fonctionnement des structures de données hiérarchiques dans Cloud Firestore, considérons un exemple d'application de discussion avec des messages et des salles de discussion.

Vous pouvez créer une collection appelée rooms pour stocker différentes salles de chat:

  • chambres

    • ROOMA

      name : "my chat room"

    • roomB

      ...

Maintenant que vous disposez de salons de discussion, décidez comment stocker vos messages. Vous ne voudrez peut-être pas les stocker dans le document de la salle de discussion. Les documents dans Cloud Firestore doivent être légers et une salle de discussion peut contenir un grand nombre de messages. Cependant, vous pouvez créer des collections supplémentaires dans le document de votre salle de discussion, en tant que sous-collections.

Sous-collections

Le meilleur moyen de stocker des messages dans ce scénario consiste à utiliser des sous-collections. Une sous-collection est une collection associée à un document spécifique.

Vous pouvez créer un appelé subcollection messages pour tous les documents de la place dans votre rooms collection:

  • chambres

    • ROOMA

      name : "my chat room"

      • messages

        • message1

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

        • message2

          ...

    • roomB

      ...

Dans cet exemple, vous créeriez une référence à un message dans la sous-collection avec le code suivant :

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');
Rapide
Remarque: Ce produit est disponible sur watchos et App cibles de clip.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Objectif c
Remarque: Ce produit est disponible sur watchos et App cibles de 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")
Java
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Python
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');
Aller
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");
Rubis
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Remarquez l'alternance des collections et des documents. Vos collections et documents doivent toujours suivre ce modèle. Vous ne pouvez pas référencer une collection dans une collection ou un document dans un document.

Les sous-collections vous permettent de structurer les données de manière hiérarchique, facilitant ainsi l'accès aux données. Pour obtenir tous les messages roomA , vous pouvez créer une référence de collection aux sous - collections messages et d' interagir avec elle comme vous le feriez pour tout autre référence de collecte.

Les documents des sous-collections peuvent également contenir des sous-collections, ce qui vous permet d'imbriquer davantage les données. Vous pouvez imbriquer des données jusqu'à 100 niveaux de profondeur.