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, almacenas los datos 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 se deben almacenar en colecciones. Pueden contener subcolecciones y objetos anidados, que pueden incluir campos primitivos, como strings, o tipos de objetos complejos, como listas.

Las colecciones y los documentos se crean de manera implícita en Firestore; solo debes asignar datos a un documento dentro de una colección. Si la colección o el documento no existen, Firestore los crea.

Documentos

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

Un documento que representa a un usuario alovelace puede tener el siguiente aspecto:

  • alovelace

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

Los objetos complejos anidados en un documento se llaman 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

Tal vez te parezca que los documentos son muy similares a JSON; de hecho, básicamente son JSON. Existen algunas diferencias (por ejemplo, los documentos admiten tipos de datos adicionales y su tamaño se limita a 1 MB), pero en general, puedes tratar los documentos como registros JSON livianos.

Colecciones

Los documentos viven en colecciones, que simplemente son contenedores de documentos. Por ejemplo, podrías tener una colección llamada users con los distintos usuarios de tu app, en la que haya un documento que represente a cada uno:

  • users

    • alovelace

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

    • aturing

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

Firestore no usa esquemas, por lo que tienes libertad total sobre los campos que pones en cada documento y los tipos de datos que almacenas en ellos. Los documentos dentro de la misma colección pueden contener distintos campos o almacenar distintos tipos de datos en esos campos. Sin embargo, se recomienda usar los mismos campos y tipos de datos en varios documentos, de manera que puedas consultarlos con mayor facilidad.

Una colección contiene solo documentos; no puede contener campos sin procesar con valores directamente ni tampoco otras colecciones. Consulta Datos jerárquicos para obtener una explicación sobre cómo estructurar datos más complejos en Firestore.

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

No es necesario "crear" ni "borrar" las colecciones; Cuando se crea el primer documento de una colección, esta pasa a existir. Si borras todos los documentos de una colección, esta deja de existir.

Referencias

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

Web versión 9

import { doc } from "firebase/firestore";

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

Web versión 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
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. Si deseas obtener más información, consulta Configura la autenticación para 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. Si deseas obtener más información, consulta Configura la autenticación para 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 liviano que simplemente apunta a una ubicación en la base de datos. Puedes crear una referencia sin importar si existen datos ahí, y crearla no ejecuta ninguna operación de red.

También puedes crear referencias a colecciones:

Web versión 9

import { collection } from "firebase/firestore";

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

Web versión 8

var usersCollectionRef = db.collection('users');
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
let usersCollectionRef = db.collection("users")
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
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. Si deseas obtener más información, consulta Configura la autenticación para 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. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

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

Para mayor comodidad, también puedes especificar la ruta de acceso a un documento o una colección como una string para crear referencias, con componentes de ruta separados por una barra diagonal (/). Por ejemplo, para crear una referencia al documento alovelace, debes hacer lo siguiente:

Web versión 9

import { doc } from "firebase/firestore"; 

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

Web versión 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
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. Si deseas obtener más información, consulta Configura la autenticación para 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. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

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

Datos jerárquicos

Para comprender cómo funcionan las estructuras de datos jerárquicas en Firestore, considera el siguiente ejemplo de una app de chat con mensajes y salas de chat.

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

  • rooms

    • roomA

      name : "my chat room"

    • roomB

      ...

Ahora que tienes salas de chat, decide cómo almacenarás los mensajes. Es posible que no quieras almacenarlos en el documento de la sala de chat. Los documentos en Firestore deben usar pocos recursos, y una sala de chat podría contener muchos mensajes. Sin embargo, puedes crear colecciones adicionales en el documento de la sala de chat, como subcolecciones.

Subcolecciones

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

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

  • rooms

    • roomA

      name : "my chat room"

      • messages

        • message1

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

        • message2

          ...

    • roomB

      ...

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

Web versión 9

import { doc } from "firebase/firestore"; 

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

Web versión 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
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. Si deseas obtener más información, consulta Configura la autenticación para 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. Si deseas obtener más información, consulta Configura la autenticación para 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 alternado de colecciones y documentos. Las colecciones y los documentos deben seguir este patrón siempre. No puedes hacer referencia a una colección dentro de otra colección ni a un documento dentro de otro documento.

Las subcolecciones te permiten estructurar datos de forma jerárquica, lo que facilita el acceso a los datos. Para obtener todos los mensajes de roomA, puedes crear una referencia de colección a la subcolección messages y, así, 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 en más niveles. Puedes anidar datos hasta 100 niveles de profundidad.