Modelo de datos

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. 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, que pueden incluir campos primitivos, como cadenas, u objetos complejos, como listas.

Las colecciones y los documentos se crean de forma implícita en Firestore. Solo tienes que asignar datos a un documento de una colección. Si no existe la colección o el documento, Firestore los crea.

Redactar documentos

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

Un documento que representa a un usuario alovelace podría tener este aspecto:

  • alovelace

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

Los objetos complejos y anidados de un documento se denominan mapas. Por ejemplo, puedes estructurar el nombre del usuario del ejemplo anterior con un mapa, de la siguiente manera:

  • alovelace

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

Puede que observes que los documentos se parecen mucho a JSON. De hecho, lo son. Hay algunas diferencias (por ejemplo, los documentos admiten tipos de datos adicionales y tienen un tamaño máximo de 1 MB), pero, en general, puedes tratar los documentos como registros JSON ligeros.

Colecciones

Los documentos se encuentran en colecciones, que son simplemente contenedores de documentos. Por ejemplo, puedes tener una colección users para incluir a tus distintos usuarios, cada uno de ellos representado por un documento:

  • usuarios

    • alovelace

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

    • aturing

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

Firestore no utiliza esquemas, por lo que tienes total libertad para elegir los campos que quieres incluir en cada documento y los tipos de datos que quieres almacenar en esos campos. Los documentos de una misma colección pueden contener campos diferentes o almacenar distintos tipos de datos en esos campos. Sin embargo, es recomendable usar 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 ni otras colecciones. Consulta Datos jerárquicos para obtener una explicación sobre cómo estructurar datos más complejos en Firestore.

Los nombres de los documentos de una colección son únicos. Puedes proporcionar tus propias claves, como IDs de usuario, o dejar que Firestore cree IDs aleatorios automáticamente.

No es necesario que crees ni elimines colecciones. Una vez que hayas creado el primer documento de una colección, la colección ya existirá. Si eliminas todos los documentos de una colección, esta dejará de existir.

Referencias

Cada documento de Firestore se identifica de forma única por su ubicación en la base de datos. En el ejemplo anterior se ha mostrado un documento alovelace dentro de la colección users. Para hacer referencia a esta ubicación en tu código, puedes crear una referencia a ella.

Versión web 9

import { doc } from "firebase/firestore";

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

Versión web 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
Kotlin
Android
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
Android
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");
Python
a_lovelace_ref = db.collection("users").document("alovelace")
Python
(Async)
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');
Go

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

func createDocReference(client *firestore.Client) {

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

	_ = alovelaceRef
}
PHP

PHP

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

C#

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

Una referencia es un objeto ligero que solo apunta a una ubicación de tu base de datos. Puedes crear una referencia independientemente de si hay datos o no, y crear una referencia no realiza ninguna operación de red.

También puedes crear referencias a colecciones:

Versión web 9

import { collection } from "firebase/firestore";

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

Versión web 8

var usersCollectionRef = db.collection('users');
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
let usersCollectionRef = db.collection("users")
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Kotlin
Android
val usersCollectionRef = db.collection("users")
Java
Android
CollectionReference usersCollectionRef = db.collection("users");

Dart

final usersCollectionRef = db.collection("users");
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
users_ref = db.collection("users")
Python
(Async)
users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Go

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

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

	_ = usersRef
}
PHP

PHP

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

C#

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

Para mayor comodidad, también puedes crear referencias especificando la ruta a un documento o una 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:

Versión web 9

import { doc } from "firebase/firestore"; 

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

Versión web 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];
Kotlin
Android
val alovelaceDocumentRef = db.document("users/alovelace")
Java
Android
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");
Python
a_lovelace_ref = db.document("users/alovelace")
Python
(Async)
a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
Go

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 autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

C#

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

Datos jerárquicos

Para entender cómo funcionan las estructuras de datos jerárquicas en Firestore, vamos a ver un ejemplo de una aplicación de chat con mensajes y salas de chat.

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

  • salas

    • roomA

      name : "my chat room"

    • roomB

      ...

Ahora que tienes salas de chat, decide cómo almacenar los mensajes. Puede que no quieras almacenarlos en el documento de la sala de chat. Los documentos de Firestore deben ser ligeros y una sala de chat puede contener un gran número de mensajes. Sin embargo, puedes crear colecciones adicionales en el documento de tu sala de chat como subcolecciones.

Subcolecciones

La mejor forma de almacenar mensajes en este caso es usar subcolecciones. Una subcolección es una colección asociada a un documento específico.

Puedes crear una subcolección llamada messages para cada documento de sala de tu colección rooms:

  • salas

    • roomA

      name : "my chat room"

      • mensajes

        • message1

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

        • message2

          ...

    • roomB

      ...

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

Versión web 9

import { doc } from "firebase/firestore"; 

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

Versión web 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];
Kotlin
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");

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");
Python
room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
Python
(Async)
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');
Go

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 autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

C#

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

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

Las subcolecciones te permiten estructurar los datos de forma jerárquica, lo que facilita el acceso a ellos. Para obtener todos los mensajes de roomA, puedes crear una referencia de colección a la subcolección messages e interactuar con ella como lo harías con cualquier otra referencia de colección.

Los documentos de las subcolecciones también pueden contener subcolecciones, lo que te permite anidar datos aún más. Puedes anidar datos hasta 100 niveles.