Guía Completa: Introducción a Firestore para Aplicaciones Modernas

Guía Completa: Introducción a Firestore para Aplicaciones Modernas

Firestore para Aplicaciones Modernas

Firestore es una base de datos NoSQL en tiempo real que facilita el almacenamiento y sincronización de datos para aplicaciones modernas web y móviles. Es conocida por su facilidad de uso, escalabilidad y flexibilidad. Este artículo te guiará a través de la estructura de Firestore, cómo integrarlo en tu proyecto y cuándo es la mejor opción para tus aplicaciones.

Estructura de Firestore

Bases de Datos y Colecciones

En Firestore, la estructura se organiza en bases de datos, que contienen colecciones. Cada colección es un grupo de documentos relacionados y, a diferencia de las tablas en bases de datos SQL, las colecciones en Firestore no tienen un esquema rígido, permitiendo mayor flexibilidad.

Documentos

Los documentos son los componentes básicos de datos en Firestore. Cada documento es un registro individual en formato JSON que contiene datos clave-valor. Los documentos pueden incluir datos primitivos (como cadenas y números), así como objetos anidados y listas.

{
    "nombre": "Juan Pérez",
    "edad": 30,
    "correo": "[email protected]"
}
Subcolecciones

Los documentos pueden contener subcolecciones, que son colecciones anidadas dentro de un documento. Esto permite una jerarquía flexible y organizada de datos.

Cómo Empezar a Usar Firestore

Paso 1: Añadir Firestore al Proyecto

Una vez que hayas añadido Firebase a tu proyecto instalándolo y configurándolo, el siguiente paso es integrar Firestore.

Paso 2: Configurar Firestore

Configura Firestore en tu proyecto JavaScript:

// Importa Firebase y Firestore
import { initializeApp } from "firebase/app";
import { getFirestore, collection, getDocs } from "firebase/firestore";

// Tu configuración de Firebase
const firebaseConfig = {
    apiKey: "your_api_key",
    authDomain: "your_project_id.firebaseapp.com",
    projectId: "your_project_id",
    storageBucket: "your_project_id.appspot.com",
    messagingSenderId: "your_sender_id",
    appId: "your_app_id"
};

// Inicializa Firebase
const app = initializeApp(firebaseConfig);

// Inicializa Firestore
const db = getFirestore(app);

Paso 3: Añadir y Leer Datos

Para añadir datos a Firestore, puedes usar la función addDoc en una colección específica:

import { collection, addDoc } from "firebase/firestore";

async function addUser() {
    try {
        const docRef = await addDoc(collection(db, "users"), {
            nombre: "Juan Pérez",
            edad: 30,
            correo: "[email protected]"
        });
        console.log("Documento escrito con ID: ", docRef.id);
    } catch (e) {
        console.error("Error añadiendo el documento: ", e);
    }
}

addUser();

Para leer datos de Firestore, utiliza la función getDocs:

import { collection, getDocs } from "firebase/firestore";

async function getUsers() {
    const querySnapshot = await getDocs(collection(db, "users"));
    querySnapshot.forEach((doc) => {
        console.log(`${doc.id} => ${doc.data()}`);
    });
}

getUsers();

Funciones Claves y Cuándo Usar Firestore

Funciones Claves

collection

  • Descripción: Crea una referencia a una colección.
  • Uso:
import { collection } from "firebase/firestore"; 
const collectionRef = collection(db, "nombreDeLaColeccion");
  • Parámetros:
    • db: La instancia de Firestore.
    • nombreDeLaColeccion: El nombre de la colección.
  • Devuelve: Una referencia a la colección (CollectionReference).

doc

  • Descripción: Crea una referencia a un documento específico en una colección.
  • Uso:
import { doc } from "firebase/firestore";
const docRef = doc(db, "nombreDeLaColeccion", "idDelDocumento");
  • Parámetros:
    • db: La instancia de Firestore.
    • nombreDeLaColeccion: El nombre de la colección.
    • idDelDocumento: El ID del documento.
  • Devuelve: Una referencia al documento.

addDoc

  • Descripción: Agrega un nuevo documento a una colección y genera un ID automáticamente.
  • Uso:
import { addDoc, collection } from "firebase/firestore";
const docRef = await addDoc(collection(db, "nombreDeLaColeccion"), { campo1: "valor1", campo2: "valor2" });
  • Parámetros:
    • collectionRef: La referencia a la colección.
    • data: Los datos a agregar.
  • Devuelve: Una Promise que resuelve en una referencia al documento creado.

getDoc

  • Descripción: Obtiene un documento específico.
  • Uso:
import { getDoc, doc } from "firebase/firestore";
const docSnap = await getDoc(doc(db, "nombreDeLaColeccion", "idDelDocumento")); 
if (docSnap.exists()) { console.log(docSnap.data()); }
  • Parámetros:
    • docRef: La referencia al documento.
  • Devuelve: Una Promise que resuelve en un DocumentSnapshot.

setDoc

  • Descripción: Establece los datos de un documento, creando el documento si no existe.
  • Uso:
import { setDoc, doc } from "firebase/firestore"; 
await setDoc(doc(db, "nombreDeLaColeccion", "idDelDocumento"), { campo1: "valor1", campo2: "valor2" })
  • Parámetros:
    • docRef: La referencia al documento.
    • data: Los datos a establecer.
  • Devuelve: Una Promise que se resuelve cuando la operación se completa.

updateDoc

  • Descripción: Actualiza algunos campos de un documento.
  • Uso:
import { updateDoc, doc } from "firebase/firestore"; 
await updateDoc(doc(db, "nombreDeLaColeccion", "idDelDocumento"), { campo1: "nuevoValor" })
  • Parámetros:
    • docRef: La referencia al documento.
    • data: Los campos y valores a actualizar.
  • Devuelve: Una Promise que se resuelve cuando la operación se completa.

deleteDoc

  • Descripción: Elimina un documento.
  • Uso:
import { deleteDoc, doc } from "firebase/firestore"; 
await deleteDoc(doc(db, "nombreDeLaColeccion", "idDelDocumento"));
  • Parámetros:
    • docRef: La referencia al documento.
  • Devuelve: Una Promise que se resuelve cuando la operación se completa.

getDocs

  • Descripción: Obtiene todos los documentos de una colección o de una consulta.
  • Uso:
import { getDocs, collection } from "firebase/firestore"; 
const querySnapshot = await getDocs(collection(db, "nombreDeLaColeccion")); querySnapshot.forEach((doc) => { console.log(doc.id, doc.data()); });
  • Parámetros:
    • query: La consulta o referencia a la colección.
  • Devuelve: Una Promise que resuelve en un QuerySnapshot.

where

  • Descripción: Crea una condición de filtro para una consulta.
  • Uso:
import { where } from "firebase/firestore"; 
const condition = where("campo1", "==", "valor1");
  • Parámetros:
    • campo: El campo a comparar.
    • operador: El operador de comparación (e.g., ==, <, >, <=, >=, !=).
    • valor: El valor a comparar.
  • Devuelve: Una condición de filtro (QueryConstraint).

query

  • Descripción: Crea una consulta para una colección.
  • Uso:
import { query, collection, where } from "firebase/firestore"; 
const q = query(collection(db, "nombreDeLaColeccion"), where("campo1", "==", "valor1"))
  • Parámetros:
    • collectionRef: La referencia a la colección.
    • ...queryConstraints: Las restricciones de la consulta (e.g., where, orderBy).
  • Devuelve: Una consulta (Query).

orderBy

  • Descripción: Ordena los resultados de una consulta.
  • Uso:
import { orderBy } from "firebase/firestore"; const order = orderBy("campo1", "asc")
  • Parámetros:
    • campo: El campo por el que se ordenará.
    • direccion: La dirección de orden (asc o desc).
  • Devuelve: Una condición de orden (QueryConstraint).

Estas funciones forman la base de las operaciones CRUD (Crear, Leer, Actualizar, Eliminar) en Firestore y permiten realizar consultas complejas sobre los datos almacenados en la base de datos.

Cuándo Usar Firestore

  • Aplicaciones en Tiempo Real: Si tu aplicación requiere la actualización instantánea de datos en múltiples clientes, Firestore es una excelente opción.
  • Aplicaciones Móviles y Web: Firestore se integra perfectamente con Firebase, proporcionando una solución completa para aplicaciones móviles y web.
  • Proyectos con Crecimiento Rápido: Gracias a su capacidad de escalabilidad automática, Firestore es adecuado para proyectos que anticipan un rápido crecimiento en la base de usuarios y en la cantidad de datos.

Diferenciación de las APIs de Firestore

API en Cadena

La API en cadena es la forma original de interactuar con Firestore y sigue un estilo encadenado. Es más familiar para quienes han usado Firestore antes de la introducción de la API modular.

// Crear una referencia a un documento
const userRef = db.collection("users").doc("unique_user_id");

// Establecer datos en el documento
userRef.set({
  firstName: "Ada",
  lastName: "Lovelace",
  born: 1815
});

// Obtener datos del documento
userRef.get().then((doc) => {
  if (doc.exists) {
    console.log("Document data:", doc.data());
  } else {
    console.log("No such document!");
  }
});

// Actualizar datos en el documento
userRef.update({
  lastName: "Byron"
});

// Eliminar el documento
userRef.delete();

API Modular

La API modular fue introducida para mejorar la compatibilidad con tree-shaking y optimizar el tamaño del bundle en aplicaciones web. Es más explícita en la importación de funciones y se basa en el uso de referencias directas.

import { getFirestore, collection, doc, setDoc, getDoc, updateDoc, deleteDoc } from "firebase/firestore";

// Inicializar Firestore
const db = getFirestore();

// Crear una referencia a un documento
const userRef = doc(db, 'users', 'unique_user_id');

// Establecer datos en el documento
await setDoc(userRef, {
  firstName: "Ada",
  lastName: "Lovelace",
  born: 1815
});

// Obtener datos del documento
const docSnap = await getDoc(userRef);
if (docSnap.exists()) {
  console.log("Document data:", docSnap.data());
} else {
  console.log("No such document!");
}

// Actualizar datos en el documento
await updateDoc(userRef, {
  lastName: "Byron"
});

// Eliminar el documento
await deleteDoc(userRef);

Firestore proporciona una solución robusta y flexible para el desarrollo de aplicaciones modernas, permitiendo la sincronización en tiempo real y una gestión eficiente de datos no estructurados. Su integración con Firebase facilita la implementación y escalabilidad de proyectos, haciendo de Firestore una herramienta esencial para desarrolladores.

Para más información sobre Firestore y sus funcionalidades, visita la documentación oficial de Firebase.

Comentarios

Para comentar debes Iniciar sesión o registrarte.