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
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective‑C
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
Python
Python
(Async)
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Go
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.
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.
Ruby
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
let usersCollectionRef = db.collection("users")
Objective‑C
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
Python
Python
(Async)
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Go
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.
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.
Ruby
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
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective‑C
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
Python
Python
(Async)
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Go
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.
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.
Ruby
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
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Objective‑C
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
Python
Python
(Async)
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Go
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.
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.
Ruby
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.