Modelo de datos de Cloud Firestore

Cloud Firestore es una base de datos NoSQL orientada a documentos. A diferencia de una base de datos SQL, no hay tablas ni filas. En su lugar, los datos se almacenan en documentos , que se organizan en colecciones .

Cada documento contiene un conjunto de pares clave-valor. Cloud Firestore está optimizado para almacenar grandes colecciones de documentos pequeños.

Todos los documentos deben almacenarse en colecciones. Los documentos pueden contener subcolecciones y objetos anidados, los cuales pueden incluir campos primitivos como cadenas u objetos complejos como listas.

Las colecciones y los documentos se crean implícitamente en Cloud Firestore. Simplemente asigne datos a un documento dentro de una colección. Si la colección o el documento no existe, Cloud Firestore lo crea.

Documentos

En Cloud Firestore, la unidad de almacenamiento es el documento. Un documento es un registro liviano que contiene campos que se asignan a valores. Cada documento se identifica con un nombre.

Un documento que represente a un usuario alovelace podría verse así:

  • alovelace

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

Los objetos complejos y anidados en un documento se denominan mapas. Por ejemplo, podrías estructurar el nombre del usuario del ejemplo anterior con un mapa, como este:

  • alovelace

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

Puede notar que los documentos se parecen mucho a JSON. De hecho, básicamente lo son. Existen algunas diferencias (por ejemplo, los documentos admiten tipos de datos adicionales y su tamaño está limitado a 1 MB), pero en general, puede tratar los documentos como registros JSON livianos.

Colecciones

Los documentos viven en colecciones, que son simplemente contenedores de documentos. Por ejemplo, podría tener una colección users que contenga varios usuarios, cada uno representado por un documento:

  • usuarios

    • alovelace

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

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

Cloud Firestore no tiene esquemas, por lo que tienes total libertad sobre qué campos colocas en cada documento y qué tipos de datos almacenas en esos campos. Todos los documentos dentro de la misma colección pueden contener diferentes campos o almacenar diferentes tipos de datos en esos campos. Sin embargo, es una buena idea utilizar los mismos campos y tipos de datos en varios documentos, para poder consultar los documentos más fácilmente.

Una colección contiene documentos y nada más. No puede contener directamente campos sin formato con valores y no puede contener otras colecciones. (Consulta Datos jerárquicos para obtener una explicación sobre cómo estructurar datos más complejos en Cloud Firestore).

Los nombres de los documentos dentro de una colección son únicos. Puede proporcionar sus propias claves, como ID de usuario, o puede dejar que Cloud Firestore cree ID aleatorias automáticamente.

No es necesario "crear" ni "eliminar" colecciones. Después de crear el primer documento de una colección, la colección existe. Si elimina todos los documentos de una colección, ésta ya no existe.

Referencias

Cada documento en Cloud Firestore se identifica de forma única por su ubicación dentro de la base de datos. El ejemplo anterior mostraba un documento alovelace dentro de la colección users . Para hacer referencia a esta ubicación en su código, puede crear una referencia a ella.

Web modular API

import { doc } from "firebase/firestore";

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

Web namespaced API

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Rápido
Nota: Este producto no está disponible en destinos watchOS y App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
C objetivo
Nota: Este producto no está disponible en destinos watchOS y App Clip.
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");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Pitón
a_lovelace_ref = db.collection("users").document("alovelace")

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Nodo.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
Ir

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
PHP

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$document = $db->collection('samples/php/users')->document('alovelace');
Unidad
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

DocumentReference documentRef = db.Collection("users").Document("alovelace");
Rubí
document_ref = firestore.col("users").doc("alovelace")

Una referencia es un objeto liviano que simplemente apunta a una ubicación en su base de datos. Puede crear una referencia independientemente de que existan datos allí o no, y la creación de una referencia no realiza ninguna operación de red.

También puedes crear referencias a colecciones :

Web modular API

import { collection } from "firebase/firestore";

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

Web namespaced API

var usersCollectionRef = db.collection('users');
Rápido
Nota: Este producto no está disponible en destinos watchOS y App Clip.
let usersCollectionRef = db.collection("users")
C objetivo
Nota: Este producto no está disponible en destinos watchOS y App Clip.
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");
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Pitón
users_ref = db.collection("users")

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Nodo.js
const usersCollectionRef = db.collection('users');
Ir

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
PHP

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$collection = $db->collection('samples/php/users');
Unidad
CollectionReference collectionRef = db.Collection("users");
C#

C#

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

CollectionReference collectionRef = db.Collection("users");
Rubí
collection_ref = firestore.col "users"

Para mayor comodidad, también puede crear referencias especificando la ruta a un documento o colección como una cadena, con los componentes de la ruta separados por una barra diagonal ( / ). Por ejemplo, para crear una referencia 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');
Rápido
Nota: Este producto no está disponible en destinos watchOS y App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
C objetivo
Nota: Este producto no está disponible en destinos watchOS y App Clip.
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");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Pitón
a_lovelace_ref = db.document("users/alovelace")

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Nodo.js
const alovelaceDocumentRef = db.doc('users/alovelace');
Ir

import (
	"cloud.google.com/go/firestore"
)

func createDocReferenceFromString(client *firestore.Client) {
	// Reference to a document with id "alovelace" in the collection "users"
	alovelaceRef := client.Doc("users/alovelace")

	_ = alovelaceRef
}
PHP

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$document = $db->document('users/alovelace');
Unidad
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

DocumentReference documentRef = db.Document("users/alovelace");
Rubí
document_path_ref = firestore.doc "users/alovelace"

Datos jerárquicos

Para comprender cómo funcionan las estructuras de datos jerárquicas en Cloud Firestore, considere una aplicación de chat de ejemplo con mensajes y salas de chat.

Puedes crear una colección llamada rooms para almacenar diferentes salas de chat:

  • de habitaciones

    • salón

      name : "my chat room"

    • salón B

      ...

Ahora que tienes salas de chat, decide cómo almacenar tus mensajes. Es posible que no desees almacenarlos en el documento de la sala de chat. Los documentos en Cloud Firestore deben ser livianos y una sala de chat puede contener una gran cantidad de mensajes. Sin embargo, puedes crear colecciones adicionales dentro del documento de tu sala de chat, como subcolecciones.

Subcolecciones

La mejor manera de almacenar mensajes en este escenario es mediante subcolecciones. Una subcolección es una colección asociada a un documento específico.

Puede crear una subcolección llamada messages para cada documento de sala de su colección rooms :

  • de habitaciones

    • salón

      name : "my chat room"

      • mensajes

        • mensaje

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

        • mensaje

          ...

    • salón B

      ...

En este ejemplo, crearía una referencia a un mensaje en la subcolección con el siguiente código:

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');
Rápido
Nota: Este producto no está disponible en destinos watchOS y App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
C objetivo
Nota: Este producto no está disponible en destinos watchOS y App Clip.
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");
Java
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Pitón
room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("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");
Nodo.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
Ir

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
PHP

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Unidad
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#

C#

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Rubí
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Observe el patrón alterno de colecciones y documentos. Tus colecciones y documentos siempre deben seguir este patrón. No puede hacer referencia a una colección en una colección o a un documento en un documento.

Las subcolecciones le permiten estructurar los datos jerárquicamente, lo que facilita el acceso a los datos. Para obtener todos los mensajes en roomA , puede crear una referencia de colección para los messages de la subcolección e interactuar con ella como lo haría con cualquier otra referencia de colección.

Los documentos en subcolecciones también pueden contener subcolecciones, lo que le permite anidar más datos. Puede anidar datos hasta 100 niveles de profundidad.