<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Firebase - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Firebase - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 06 Jun 2026 08:42:57 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/firebase/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear una aplicación Fullstack con Next.js 13 y Firebase ]]>
                </title>
                <description>
                    <![CDATA[ > Nota: Al momento de escribir este artículo (17 de Febrero de 2023), la versión 13 de Next.js fue lanzado, el 25 de Octubre de 2022 para ser exacto.  El equipo detrás de Next.js ha lanzado recientemente Next.js 13 [https://nextjs.org/blog/next-13], que tiene un montón de características nuevas como un ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-una-aplicacion-full-stack-con-next-js-13-y-firebase/</link>
                <guid isPermaLink="false">66c75e5ca244b004a5d60a64</guid>
                
                    <category>
                        <![CDATA[ next.js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firebase ]]>
                    </category>
                
                    <category>
                        <![CDATA[ full stack ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Thu, 19 Sep 2024 21:32:31 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/09/pexels-sevenstorm-juhaszimrus-443383--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <blockquote><strong>Nota</strong>: Al momento de escribir este artículo (17 de Febrero de 2023), la versión 13 de Next.js fue lanzado, el 25 de Octubre de 2022 para ser exacto. </blockquote><p>El equipo detrás de Next.js <a href="https://nextjs.org/blog/next-13">ha lanzado recientemente Next.js 13</a>, que tiene un montón de características nuevas como un nuevo directorio <code>app</code>, componentes para el lado del servidor y del cliente, entre otros.</p><p>En este artículo, aprenderás cómo usar el nuevo Next.js 13 y la Base de Datos Firebase para crear una aplicación <em>full stack.</em></p><p>Antes de continuar, para poder seguir el artículo necesitas tener un conocimiento básico de JavaScript, React y Next.js. Si necesitas repasar alguno de esos conceptos, aquí tienes algún recursos para principiantes:</p><ul><li><a href="https://www.freecodecamp.org/news/learn-javascript-interactive-course/">Aprende JavaScript - contenidos y curso interactivo [en inglés]</a></li><li><a href="https://www.freecodecamp.org/news/learn-react-js-in-this-free-7-hour-course/">Aprende React - curso completo [en inglés]</a></li><li><a href="https://www.freecodecamp.org/news/the-next-js-handbook/">Aprende Next.js - cuadernillo completo [en inglés]</a></li></ul><p>Si estás listo, empecemos.</p><h2 id="c-mo-crear-un-nuevo-proyecto-de-next-js-13"><strong>Cómo crear un nuevo proyecto de Next.js 13</strong></h2><p>Para instalar Next.js, necesitas tener instalado Node.js y npm/yarn instalado en tu computadora. Si no los tienes, puedes bajarlos desde sus sitios oficiales: <a href="https://nodejs.org/en/">Node.js website</a> y <a href="https://www.npmjs.com/">npm website</a> (aunque npm está incluido al instalar Node).</p><ol><li>En el directorio que quieras, inicia la terminal de tu computadora y ejecuta el siguiente comando: <code>npx create-next-app@13 --experimental-app</code>.</li><li>Elige el nombre de tu proyecto y presiona enter para crearlo y esperar a que lo instale.</li><li>Se creará un nuevo directorio con el nombre de tu proyecto con todos archivos necesarios.</li><li>Ejecuta el comando cd para cambiar al directorio nuevo: <br><code>cd my-project-name</code></li><li>Y para iniciar el servidor de desarrollo<strong>, </strong>ejecuta el siguiente comando:</li></ol><pre><code class="language-bash">// si estás usando yarn
yarn run dev

// si estás usando npm
npm run dev</code></pre><p>6. Ejecutar este comando iniciará el servidor de desarrollo para que puedas ver tu aplicación en tiempo real en <a href="http://localhost:3000/">http://localhost:3000</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-5.33.52-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-5.33.52-PM" width="600" height="400" loading="lazy"></figure><p><strong>Cómo instalar Firebase en Next.js</strong></p><p>Firebase es una plataforma Baas -<em> Backend-as-a-Service</em>, por su sigla en inglés- que ofrece servicios como autenticación, bases de datos en tiempo real, almacenamiento en la nube, análisis de datos, entre otros.</p><p>En este tutorial, usaremos Firebase como nuestra base de datos. Sigue estos pasos para crear una aplicación Firebase:</p><ol><li>En <a href="https://console.firebase.google.com/">https://console.firebase.google.com/</a>, inicia sesión con tu cuenta de Google.</li><li>Haz click en <strong>Crear proyecto</strong> y ponle un nombre. Luego, haz clic en <strong>Continuar</strong>.</li><li>En la pantalla siguiente puedes elegir si quieres habilitar métodos de análisis de datos para tu proyecto.</li><li>Haz clic en <strong>Crear proyecto.</strong></li></ol><p>Luego, necesitas crear una aplicación web. En la página de inicio, haz clic en el ícono de web para crear la aplicación:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-5.40.33-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-5.40.33-PM" width="600" height="400" loading="lazy"></figure><p>Ponle un nombre a tu aplicación y haz clic en <strong>Registrar app:</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-5.40.48-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-5.40.48-PM" width="600" height="400" loading="lazy"></figure><p>Copia el archivo de configuración ya que vamos a necesitarlo luego. Haz clic en continuar hasta que termines.</p><p>Una vez que estés de vuelta en la página de inicio de tu proyecto, elige un producto que quieras agregar en tu aplicación. Para este tutorial, sólo agrega <strong>Authentication</strong> y <strong>Cloud Firestore</strong>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-6.33.34-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-6.33.34-PM" width="600" height="400" loading="lazy"></figure><p>Para <strong>Authentication</strong><em>, </em>elige <strong>Método de acceso </strong>y agrega <strong>Correo electrónico/contraseña</strong>.</p><p>Después de instalar exitosamente Firebase, ya lo podemos usar como back-end en tu aplicación de Next.js 13.</p><p>Para usar Firebase con Next.js, sigue estos pasos.</p><p>Instala la última versión del SDK de Firebase en tu proyecto Next.js ejecutando el siguiente comando en tu terminal: </p><pre><code class="language-js">yarn add firebase

// o si estás usando npm
npm install firebase
</code></pre><p>Crea un archivo <code>.env</code> en el directorio raíz de tu proyecto Next.js y copia tus archivos de configuración de Firebase (los que habías copiado antes). Debería verse así:</p><pre><code class="language-js">NEXT_PUBLIC_FIREBASE_API_KEY=api-key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=auth-domain
NEXT_PUBLIC_FIREBASE_PROJECT_ID=project-id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=storage-bucket
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=sender-id
NEXT_PUBLIC_FIREBASE_APP_ID=app-id
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=analytic-id
</code></pre><p>Luego, para que se vea todo más prolijo, en tu directorio <strong>src</strong> crea una carpeta con el nombre <strong>firebase</strong> y crea un archivo <code>config.js</code> con el siguiente código;</p><pre><code class="language-js">// Importa las funciones que necesites de los SDKs 
import { initializeApp, getApps } from "firebase/app";

const firebaseConfig = {
    apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
    authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
    projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
    storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
    messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
    appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
    measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
};

// Inicializa Firebase
let firebase_app = getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0];

export default firebase_app;
</code></pre><p>Con esto ya listo, ya puedes utilizar Firebase como base de datos en tu aplicación Next.js.</p><h2 id="c-mo-instalar-authentication">Cómo instalar Authentication</h2><p>Al querer construir aplicaciones <em>fullstack</em>, lo primero en lo que pensamos es la autenticación de usuarios. Con Firebase, podemos crear una forma de registrar usuarios o de que inicien sesión muy fácilmente.</p><p>En tu directorio <strong>src &gt; firebase</strong>, crea una nueva carpeta con el nombre <strong>auth</strong>. Todo el código relacionado con la autenticación de firebase lo guardaremos aquí.</p><p>Luego, crea un archivo <code>signup.js</code> &nbsp;dentro del directorio <strong>src &gt; firebase &gt; auth </strong>con el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { createUserWithEmailAndPassword, getAuth } from "firebase/auth";

const auth = getAuth(firebase_app);


export default async function signUp(email, password) {
    let result = null,
        error = null;
    try {
        result = await createUserWithEmailAndPassword(auth, email, password);
    } catch (e) {
        error = e;
    }

    return { result, error };
}

</code></pre><p>Vamos a descrifrar este código. Lo que estamos haciendo aquí es exportando la función <code>signUp()</code> que usa el método <strong>createUserWithEmailAndPassword() </strong>de Firebase para poder registrar nuevos usuarios. Luego de hacer esto, vamos a poder usar la función <code>signUp()</code> en cualquier lado de nuestra app.</p><p>En la misma carpeta, agreguemos nuestra función <code>signIn()</code>. Para hacer esto, crea un archivo <code>signin.js</code> con el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { signInWithEmailAndPassword, getAuth } from "firebase/auth";

const auth = getAuth(firebase_app);

export default async function signIn(email, password) {
    let result = null,
        error = null;
    try {
        result = await signInWithEmailAndPassword(auth, email, password);
    } catch (e) {
        error = e;
    }

    return { result, error };
}
</code></pre><h3 id="c-mo-crear-las-p-ginas-para-el-inicio-de-sesi-n-y-el-registro-de-usuarios-en-next-js">Cómo crear las páginas para el inicio de sesión y el registro de usuarios en Next.js</h3><p>En Next.js 13 se puede crear nuevas páginas dentro del directorio <code>app</code>. Cada página es una carpeta con un archivo <code>page.js</code>. Para aprender más sobre cómo crear páginas, puedes leer la <a href="https://beta.nextjs.org/docs/routing/pages-and-layouts">documentación de Next.js al respecto [en inglés]</a>.</p><p>Para crear un página de registro de usuarios un nuevo archivo <code>page.js</code> en <strong>signup</strong>, dentro de tu directorio <strong>app</strong>. Luego, agrega el siguiente código: </p><pre><code class="language-jsx">'use client'
import React from "react";
import signUp from "@/firebase/auth/signup";
import { useRouter } from 'next/navigation'

function Page() {
    const [email, setEmail] = React.useState('')
    const [password, setPassword] = React.useState('')
    const router = useRouter()

    const handleForm = async (event) =&gt; {
        event.preventDefault()

        const { result, error } = await signUp(email, password);

        if (error) {
            return console.log(error)
        }

        // else successful
        console.log(result)
        return router.push("/admin")
    }
    return (&lt;div className="wrapper"&gt;
        &lt;div className="form-wrapper"&gt;
            &lt;h1 className="mt-60 mb-30"&gt;Sign up&lt;/h1&gt;
            &lt;form onSubmit={handleForm} className="form"&gt;
                &lt;label htmlFor="email"&gt;
                    &lt;p&gt;Email&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setEmail(e.target.value)} required type="email" name="email" id="email" placeholder="example@mail.com" /&gt;
                &lt;/label&gt;
                &lt;label htmlFor="password"&gt;
                    &lt;p&gt;Password&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setPassword(e.target.value)} required type="password" name="password" id="password" placeholder="password" /&gt;
                &lt;/label&gt;
                &lt;button type="submit"&gt;Sign up&lt;/button&gt;
            &lt;/form&gt;
        &lt;/div&gt;
    &lt;/div&gt;);
}

export default Page;`
</code></pre><p>Por defecto, cada página que se agrega al directorio <code>page.js</code> es un <a href="https://beta.nextjs.org/docs/rendering/server-and-client-components">componente del servidor [enlace a la documentación en inglés]</a> y por lo tanto no permite agregar interactividad de lado del servidor como un <code>onSubmit()</code> a elementos de formulario. Para poder agregar esta interactividad, tenemos que decirle a Next.js que queremos un componente Cliente. Para hacer esto, añadimos lo siguiente al comienzo del archivo y antes de importar cualquier otro elemento:</p><pre><code class="language-js">'use client'

// código del componente
</code></pre><p>Del mismo modo vamos a crear nuestra página de inicio de sesión. Para crear esta página, crea un archivo <strong>page.js</strong> en <strong>signin</strong>, dentro de tu directorio <strong>app</strong>, y agrega el siguiente código:</p><pre><code class="language-jsx">'use client'
import React from "react";
import signIn from "@/firebase/auth/signin";
import { useRouter } from 'next/navigation'

function Page() {
    const [email, setEmail] = React.useState('')
    const [password, setPassword] = React.useState('')
    const router = useRouter()

    const handleForm = async (event) =&gt; {
        event.preventDefault()

        const { result, error } = await signIn(email, password);

        if (error) {
            return console.log(error)
        }

        // sino exitoso
        console.log(result)
        return router.push("/admin")
    }
    return (&lt;div className="wrapper"&gt;
        &lt;div className="form-wrapper"&gt;
            &lt;h1 className="mt-60 mb-30"&gt;Sign up&lt;/h1&gt;
            &lt;form onSubmit={handleForm} className="form"&gt;
                &lt;label htmlFor="email"&gt;
                    &lt;p&gt;Email&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setEmail(e.target.value)} required type="email" name="email" id="email" placeholder="example@mail.com" /&gt;
                &lt;/label&gt;
                &lt;label htmlFor="password"&gt;
                    &lt;p&gt;Password&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setPassword(e.target.value)} required type="password" name="password" id="password" placeholder="password" /&gt;
                &lt;/label&gt;
                &lt;button type="submit"&gt;Sign up&lt;/button&gt;
            &lt;/form&gt;
        &lt;/div&gt;

    &lt;/div&gt;);
}

export default Page;
</code></pre><h3 id="c-mo-saber-si-hubo-alg-n-cambio-de-autenticaci-n">Cómo saber si hubo algún cambio de autenticación</h3><p>Mientras estás usando la aplicación, siempre vamos a querer saber si el usuario ha iniciado sesión o no. Si el usuario ha iniciado sesión, es posible crear páginas protegidas y mostrarle ciertos contenidos sólo a él. Firebase tiene el método <code>onAuthStateChanged()</code> para poder saber si hubo cambios.</p><p>Para que la información del usuario obtenida con el método mencionado arriba pueda ser usada en todo la aplicación, vamos a usar la API React Context. Crea un carpeta con el nombre <strong>context</strong> en tu directorio <strong>src. </strong>Dentro del directorio <strong>directory</strong>, crea un archivo con el nombre <code>AuthContext.js</code> y agrega el siguiente código:</p><pre><code class="language-jsx">import React from 'react';
import {
    onAuthStateChanged,
    getAuth,
} from 'firebase/auth';
import firebase_app from '@/firebase/config';

const auth = getAuth(firebase_app);

export const AuthContext = React.createContext({});

export const useAuthContext = () =&gt; React.useContext(AuthContext);

export const AuthContextProvider = ({
    children,
}) =&gt; {
    const [user, setUser] = React.useState(null);
    const [loading, setLoading] = React.useState(true);

    React.useEffect(() =&gt; {
        const unsubscribe = onAuthStateChanged(auth, (user) =&gt; {
            if (user) {
                setUser(user);
            } else {
                setUser(null);
            }
            setLoading(false);
        });

        return () =&gt; unsubscribe();
    }, []);

    return (
        &lt;AuthContext.Provider value={{ user }}&gt;
            {loading ? &lt;div&gt;Loading...&lt;/div&gt; : children}
        &lt;/AuthContext.Provider&gt;
    );
};
</code></pre><p>Con el código de arriba simplemente creamos un Provider que devuelve el objeto usuario si el usuario inició sesión. De lo contrario, sólo devolverá <code>null</code>.</p><p>Para poder usar el valor que se le pasó a <code>&lt;AuthContext.Provider&gt;</code> &nbsp;vamos a exportar <code>useAuthContext</code> desde el archivo y así usar el valor de <code>user</code>.</p><p>Antes de poder usar este contexto, necesitamos envolver todos los componentes con <code>AuthContextProvider</code>. Para hacer esto, abrimos el archivo <strong>layout.js</strong> dentro del directorio <strong>src &gt; app</strong> y editamos el código con lo siguiente:</p><pre><code class="language-jsx">'use client'
import './globals.css'
import { AuthContextProvider } from '@/context/AuthContext'

export default function RootLayout({ children }) {
  return (
    &lt;html lang="en"&gt;
      {/*
        &lt;head /&gt; contendrá los componentes devueltos por el padre más cercano
        head.js. Encuentra más información en https://beta.nextjs.org/docs/api-reference/file-conventions/head
      */}
      &lt;head /&gt;
      &lt;body&gt;
        &lt;AuthContextProvider&gt;
          {children}
        &lt;/AuthContextProvider&gt;
      &lt;/body&gt;
    &lt;/html&gt;
  )
}

</code></pre><p>Ahora ya podemos crear páginas protegidas y mostrar contenido específico a usuarios distintos.</p><h3 id="c-mo-crear-p-ginas-protegidas">Cómo crear páginas protegidas</h3><p>Dentro del directorio <strong>app, </strong>crea el directorio <strong>admin &gt; page.js </strong> y agrega el siguiente código:</p><pre><code class="language-jsx">'use client'
import React from "react";
import { useAuthContext } from "@/context/AuthContext";
import { useRouter } from "next/navigation";
function Page() {
    const { user } = useAuthContext()
    const router = useRouter()

    React.useEffect(() =&gt; {
        if (user == null) router.push("/")
    }, [user])

    return (&lt;h1&gt;Solamente los usuarios que iniciaron sesión pueden ver esta página&lt;/h1&gt;);
}

export default Page;
</code></pre><p>Si el usuario es <code>null</code>, lo redireccionamos a la página inicial. De lo contrario, si no es <code>null</code>, le mostramos la página protegida.</p><h2 id="c-mo-comunicarse-con-nuestra-base-de-datos">Cómo comunicarse con nuestra base de datos</h2><p>Ahora que ya lidiamos con la parte de autenticación, podemos enfocarnos en la comunicación con nuestra base de datos. Como base de datos vamos a usar <strong>Firestore.</strong></p><p>Para seguir haciendo todo ordenado, vamos a crear un nuevo directorio llamado <strong>firebase &gt; firestore</strong>. Dentro de este directorio vamos a guardar todo el código relacionado con Firestore.</p><h3 id="c-mo-agregar-documentos-a-firestore">Cómo agregar documentos a Firestore</h3><p>Dentro del directorio <strong>firestore</strong>, crea un archivo con el nombre <code>addData.js</code> y agrega el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { getFirestore, doc, setDoc } from "firebase/firestore";

const db = getFirestore(firebase_app)
export default async function addData(colllection, id, data) {
    let result = null;
    let error = null;

    try {
        result = await setDoc(doc(db, colllection, id), data, {
            merge: true,
        });
    } catch (e) {
        error = e;
    }

    return { result, error };
}
</code></pre><p>Este código ya debería serte familiar: estamos exportando una función que permite agregar información a nuestra base de datos firestore.</p><p>Ahora ya podemos usar esta función <code>addData()</code> desde cualquier componente para agregar información a nuestra base de datos:</p><pre><code class="language-js">'use client'
import addData from "@/firebase/firestore/addData";

export default function Home() {

  const handleForm = async () =&gt; {
    const data = {
      name: 'John snow',
      house: 'Stark'
    }
    const { result, error } = await addData('users', 'user-id', data)

    if (error) {
      return console.log(error)
    }
  }
  
  return (
    ...
  )
}

</code></pre><h3 id="c-mo-podemos-obtener-un-documento-desde-firestore">Cómo podemos obtener un documento desde Firestore</h3><p>Usando un método similar, podemos obtener un documento desde nuestra base de datos Firebase.</p><p>Crea un archivo <code>getData.js</code> dentro del directorio <strong>Firestore </strong>y agrega el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { getFirestore, doc, getDoc } from "firebase/firestore";

const db = getFirestore(firebase_app)
export default async function getDoument(collection, id) {
    let docRef = doc(db, collection, id);

    let result = null;
    let error = null;

    try {
        result = await getDoc(docRef);
    } catch (e) {
        error = e;
    }

    return { result, error };
}

</code></pre><p>También podemos usar está función en cualquier componente que quieras.</p><h2 id="conclusi-n">Conclusión</h2><p>En este artículo, aprendimos cómo construir una aplicación <em>fullstack</em> usando Firebase y Next.js 13 para agregar autenticación e interacción con nuestra base de datos.</p><p>¡Feliz codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript + Firestore tutorial 2020: Aprende con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ Cloud Firestore es una base de datos NoSQL sin servidor y muy rápida, perfecta para alimentar aplicaciones web y móviles de cualquier tamaño. Obtenga la guía completa para el aprendizaje de Firestore [https://join.codeartistry.io/2020/s/firestore], creada para mostrar cómo utilizar Firestore, como motor de sus propios proyectos increíbles de principio a fin. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/javascript-firestore-tutorial-2020-aprende-con-ejemplos/</link>
                <guid isPermaLink="false">604d4751c2765408ef8ddfd7</guid>
                
                    <category>
                        <![CDATA[ Firebase ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Santiago Toquica Yanguas ]]>
                </dc:creator>
                <pubDate>Fri, 21 May 2021 04:41:03 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/05/The-Firestore-Tutorial-2020-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Cloud Firestore es una base de datos NoSQL sin servidor y muy rápida, perfecta para alimentar aplicaciones web y móviles de cualquier tamaño. <a href="https://join.codeartistry.io/2020/s/firestore">Obtenga la guía completa para el aprendizaje de Firestore</a>, creada para mostrar cómo utilizar Firestore, como motor de sus propios proyectos increíbles de principio a fin.</p><h2 id="tabla-de-contenidos">Tabla de contenidos</h2><p>Cómo empezar a usar Firestore</p><ul><li>¿Qué es Firestore? ¿Por qué debería utilizarlo?</li><li>Configuración de Firestore en un proyecto JavaScript</li><li>Documentos y colecciones de Firestore</li><li>Gestionar nuestra base de datos con la consola de Firebase</li></ul><p>Obtención de datos con Firestore</p><ul><li>Obtención de datos de una colección con .get()</li><li>Suscripción a una colección con .onSnapshot()</li><li>Diferencia entre .get() y .onSnapshot()</li><li>Desuscripción de una colección</li><li>Obtención de documentos individuales</li></ul><p>Modificación de datos con Firestore</p><ul><li>Añadir un documento a una colección con .add()</li><li>Añadir un documento a una colección con .set()</li><li>Actualización de datos existentes</li><li>Eliminación de datos</li></ul><p>Patrones esenciales</p><ul><li>Trabajar con subcolecciones</li><li>Métodos útiles para los campos de Firestore</li><li>Consulta con .where()</li><li>Ordenar y limitar los datos</li></ul><p><a href="https://join.codeartistry.io/2020/s/firestore"><strong>Nota:</strong> puedes descargar una versión en PDF de este tutorial para poder leerlo sin conexión.</a></p><h3 id="-qu-es-firestore-por-qu-deber-a-utilizarlo">¿Qué es Firestore? ¿Por qué debería utilizarlo?</h3><p>Firestore es una base de datos muy flexible y fácil de usar para el desarrollo de móviles, web y servidores. Si estás familiarizado con la base de datos en tiempo real de Firebase, Firestore tiene muchas similitudes, pero con una API diferente (posiblemente más declarativa).</p><p>Estas son algunas de las características que aporta Firestore:</p><h4 id="-obtenga-f-cilmente-datos-en-tiempo-real">⚡️Obtenga fácilmente datos en tiempo real</h4><p>Al igual que la base de datos en tiempo real de Firebase, Firestore proporciona métodos útiles como .onSnapshot(), que hacen que sea muy fácil escuchar las actualizaciones de tus datos en tiempo real. Esto hace que Firestore sea una opción ideal para los proyectos que dan prioridad a la visualización y el uso de los datos más recientes (aplicaciones de chat, por ejemplo).</p><h4 id="flexibilidad-como-base-de-datos-nosql">? Flexibilidad como base de datos NoSQL</h4><p>Firestore es una opción muy flexible para backend, porque es una base de datos NoSQL. NoSQL significa que los datos no se almacenan en tablas y columnas como lo haría una base de datos SQL estándar. Está estructurada como un almacén de valores clave, como si fuera un gran objeto de JavaScript.</p><p>En otras palabras, no hay ningún esquema, ni necesidad de describir qué datos almacenará nuestra base de datos. Mientras proporcionemos claves y valores válidos, Firestore los almacenará.</p><h4 id="-escalable-sin-esfuerzo">↕️ Escalable sin esfuerzo</h4><p>Una de las grandes ventajas de elegir Firestore, para su base de datos es la potente infraestructura sobre la que se asienta y que le permite escalar su aplicación con gran facilidad. Tanto vertical como horizontalmente. No importa si tienes cientos o millones de usuarios. Los servidores de Google serán capaces de soportar cualquier carga que les impongas.</p><p>En resumen, Firestore es una gran opción para aplicaciones tanto pequeñas como grandes. Para aplicaciones pequeñas es potente, porque podemos hacer mucho sin mucha configuración y crear proyectos rápidamente con ellos. Firestore es muy adecuado, para proyectos grandes debido a su escalabilidad.</p><h3 id="configuraci-n-de-firestore-en-un-proyecto-javascript">Configuración de Firestore en un proyecto JavaScript</h3><blockquote>Vamos a utilizar el SDK de Firestore para JavaScript. A lo largo de esta hoja de trucos, cubriremos cómo utilizar Firestore dentro del contexto de un proyecto de JavaScript. A pesar de esto, los conceptos que cubriremos aquí son fácilmente transferibles a cualquiera de las librerías cliente de Firestore disponibles.</blockquote><p>Para empezar con Firestore, nos dirigiremos a la consola de Firebase. Puedes visitarla yendo a <a href="https://firebase.com">firebase.google.com</a>. Tendrás que tener una cuenta de Google para iniciar sesión.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/09/firebase.png" class="kg-image" alt="firebase" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/09/firebase.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/09/firebase.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/09/firebase.png 1256w" sizes="(min-width: 720px) 720px" width="1256" height="632" loading="lazy"><figcaption>Firebase</figcaption></figure><p>Una vez iniciada la sesión, crearemos un nuevo proyecto y le daremos un nombre.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/09/create-a-project.png" class="kg-image" alt="create-a-project" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/09/create-a-project.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/09/create-a-project.png 822w" sizes="(min-width: 720px) 720px" width="822" height="699" loading="lazy"><figcaption>Crea un proyecto</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/codeFirebase.PNG" class="kg-image" alt="codeFirebase" width="483" height="308" loading="lazy"></figure><p>Una vez creado nuestro proyecto, lo seleccionaremos. Después, en el tablero de nuestro proyecto, seleccionaremos el botón de código.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/ReFirebase.PNG" class="kg-image" alt="ReFirebase" width="554" height="490" loading="lazy"><figcaption>Registra la aplicación</figcaption></figure><p>Esto nos dará el código que necesitamos para integrar Firestore con nuestro proyecto JavaScript.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/registerFirebase.PNG" class="kg-image" alt="registerFirebase" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/registerFirebase.PNG 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/registerFirebase.PNG 791w" sizes="(min-width: 720px) 720px" width="791" height="864" loading="lazy"><figcaption>código de SDK</figcaption></figure><p>Normalmente, si estás configurando esto en cualquier tipo de aplicación JavaScript, querrás ponerlo en un archivo dedicado llamado firebase.js. Si estás usando cualquier biblioteca de JavaScript que tiene un archivo package.json, querrás instalar la dependencia de Firebase con npm o yarn.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">// Con npm
npm i firebase

// Con yarn
yarn add firebase</code></pre><figcaption>Dependencia</figcaption></figure><p>Firestore puede utilizarse tanto en el cliente como en el servidor. Si estás usando Firestore con Node, tendrás que usar la sintaxis de CommonJS con require. De lo contrario, si estás usando JavaScript en el cliente, importarás firebase usando ES Modules.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">// Con sintaxis Commonjs (Si, estas usando Node)
const firebase = require("firebase/app");
require("firebase/firestore");

// Con ES Modules (Si, estas usando del lado del cliente, parecido a React)
import firebase from 'firebase/app';
import 'firebase/firestore';

var firebaseConfig = {
  apiKey: "AIzaSyDpLmM79mUqbMDBexFtOQOkSl0glxCW_ds",
  authDomain: "lfasdfkjkjlkjl.firebaseapp.com",
  databaseURL: "https://lfasdlkjkjlkjl.firebaseio.com",
  projectId: "lfasdlkjkjlkjl",
  storageBucket: "lfasdlkjkjlkjl.appspot.com",
  messagingSenderId: "616270824980",
  appId: "1:616270824990:web:40c8b177c6b9729cb5110f",
};
// Inicializar Firebase
firebase.initializeApp(firebaseConfig);</code></pre><figcaption>Sintaxis</figcaption></figure><h3 id="colecciones-y-documentos-de-firestore">Colecciones y documentos de Firestore</h3><p>Hay dos términos clave que son esenciales para entender cómo trabajar con Firestore: <strong>documentos</strong> y <strong>colecciones</strong>.</p><p>Los documentos son piezas individuales de datos en nuestra base de datos. Se puede pensar en los documentos, como si fueran simples objetos de JavaScript. Constan de pares <strong>clave-valor</strong>, a los que nos referimos como <strong>campos.</strong> Los valores de estos campos pueden ser <strong>strings, números, booleanos, objetos, matrices e incluso datos binarios</strong>.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">documento -&gt; { key: value } </code></pre><figcaption>Documento en Firebase</figcaption></figure><p>Los conjuntos de estos documentos se conocen como colecciones. Las colecciones son muy parecidas a los arreglos de objetos. Dentro de una colección, cada documento está vinculado a un identificador determinado (id).</p><figure class="kg-card kg-code-card"><pre><code class="language-js">colleción -&gt; [{ id: doc }, { id: doc }]</code></pre><figcaption>Collección en Firebase</figcaption></figure><h3 id="gestionar-nuestra-base-de-datos-con-la-consola-de-firestore">Gestionar nuestra base de datos con la consola de Firestore</h3><p>Antes de empezar a trabajar con nuestra base de datos tenemos que crearla.</p><p>Dentro de nuestra consola de Firebase, vaya a la pestaña "<strong>Base de datos(Database)</strong>" y cree su base de datos Firestore.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/09/firebase-database.png" class="kg-image" alt="firebase-database" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/09/firebase-database.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/09/firebase-database.png 867w" sizes="(min-width: 720px) 720px" width="867" height="458" loading="lazy"><figcaption>Base de datos Firestore</figcaption></figure><p>Una vez hecho esto, comenzaremos en modo de prueba y habilitaremos todas las lecturas y escrituras en nuestra base de datos. En otras palabras, tendremos acceso abierto para obtener y cambiar datos en nuestra base de datos. Si añadiéramos la autentificación de Firebase, podríamos restringir el acceso sólo a los usuarios autentificados.</p><p>Después de eso, seremos llevados a nuestra base de datos en sí, donde podemos empezar a crear colecciones y documentos. La raíz de nuestra base de datos será una serie de colecciones, así que vamos a hacer nuestra primera colección.</p><p>Podemos seleccionar '<strong>Iniciar colección</strong>' y darle un id. Cada colección va a tener un id o un nombre. Para nuestro proyecto, vamos a llevar un registro de los libros favoritos de nuestros usuarios. Le daremos a nuestra primera colección el id 'libros'.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/09/collection-id.png" class="kg-image" alt="collection-id" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/09/collection-id.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/09/collection-id.png 801w" sizes="(min-width: 720px) 720px" width="801" height="581" loading="lazy"><figcaption>Database</figcaption></figure><p>A continuación, añadiremos nuestro primer documento con nuestra recién creada colección "libros".</p><p>Cada documento va a tener también un id, que lo vincula a la colección en la que existe.</p><p>En la mayoría de los casos, vamos a utilizar una opción para darle un ID generado automáticamente. Así que podemos pulsar el botón '<strong>auto id</strong>' para hacerlo, después de lo cual tenemos que proporcionar un campo, darle un tipo, así como un valor.</p><p>Para nuestro primer libro, haremos un campo '<strong>title</strong>' de tipo '<strong>string</strong>', con el valor '<strong>The Great Gatsby</strong>', y pulsaremos guardar.</p><p>Después de eso, deberíamos ver nuestro primer elemento en nuestra base de datos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/09/first-item.png" class="kg-image" alt="first-item" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/09/first-item.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/09/first-item.png 810w" sizes="(min-width: 720px) 720px" width="810" height="652" loading="lazy"><figcaption>Collection</figcaption></figure><h3 id="obtener-datos-de-una-colecci-n-con-get-">Obtener datos de una colección con .get()</h3><p>Para acceder a Firestore utilizar todos los métodos que proporciona, utilizamos <code>firebase.firestore()</code>. Este método debe ser ejecutado cada vez que queramos interactuar con nuestra base de datos Firestore.</p><p>Yo recomendaría crear una variable dedicada a almacenar una única referencia a Firestore. Hacerlo ayuda a reducir la cantidad de código que se escribe en toda la aplicación.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const db = firebase.firestore();
</code></pre><figcaption>firestore</figcaption></figure><blockquote>En esta hoja de trucos, sin embargo, me voy a ceñir a usar el método firestore cada vez para ser lo más claro posible.</blockquote><p>Para referenciar una colección, utilizamos el método <code>.collection()</code> y proporcionamos el id de la colección como argumento. Para obtener una referencia a la colección de libros que hemos creado, basta con pasar la cadena 'books'.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const booksRef = firebase.firestore().collection('libros');</code></pre><figcaption>Obtener colecciones</figcaption></figure><p>Para obtener todos los datos del documento de una colección, podemos encadenar el método <code>.get()</code>.</p><p><code>.get()</code> devuelve una promesa, lo que significa que podemos resolverla usando un callback <code>.then()</code> o podemos usar la sintaxis async-await, si estamos ejecutando nuestro código dentro de una función async.</p><p>Una vez que nuestras promesas se resuelven de una manera u otra, obtenemos lo que se conoce como una <strong>instantánea</strong>.</p><p>Para una consulta de colección esa instantánea va a consistir en un número de documentos individuales. Podemos acceder a ellos diciendo <code>snapshot.docs</code>.</p><p>De cada documento, podemos obtener el id como una propiedad independiente, y el resto de los datos utilizando el método <code>.data()</code>.</p><p>Este es el aspecto de nuestra consulta completa:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const booksRef = firebase
  .firestore()
  .collection("libros");

booksRef
  .get()
  .then((results) =&gt; {
    const data = results.docs.map((doc) =&gt; ({
      id: doc.id,
      ...doc.data(),
    }));
    console.log("Toda data en la colección 'libros' ", data); 
    // [ { id: 'glMeZvPpTN1Ah31sKcnj', titulo: 'El gran Gatsby' } ]
  });</code></pre><figcaption>Obtener referencias</figcaption></figure><h3 id="suscripci-n-a-una-colecci-n-con-onsnapshot-">Suscripción a una colección con .onSnapshot()</h3><p>El método <code>.get()</code> simplemente devuelve todos los datos dentro de nuestra colección.</p><p>Para aprovechar algunas de las capacidades en tiempo real de Firestore podemos suscribirnos a una colección, lo que nos da el valor actual de los documentos de esa colección, siempre que se actualicen.</p><p>En lugar de utilizar el método <code>.get()</code>, que es para consultar una sola vez, utilizamos el método <code>.onSnapshot()</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase
  .firestore()
  .collection("libros")
  .onSnapshot((resultados) =&gt; {
    const datos = resultados.docs.map((doc) =&gt; ({
      id: doc.id,
      ...doc.data(),
    }));
    console.log("Todos los datos de la colección 'libros'", datos);
  });</code></pre><figcaption>Método onSnapshot</figcaption></figure><p>En el código anterior, estamos utilizando lo que se conoce como encadenamiento de métodos, en lugar de crear una variable separada para referenciar la colección.</p><p>Lo potente de usar firestore, es que podemos encadenar un montón de métodos uno detrás de otro, haciendo un código más declarativo y legible.</p><p>Dentro del callback de <code>onSnapshot</code>, obtenemos acceso directo a la <strong>instantánea(snapshot)</strong> de nuestra colección, tanto como ahora y cuando se actualice en el futuro. Intenta actualizar manualmente nuestro único documento y verás que <code>.onSnapshot()</code> está a la escucha de cualquier cambio en esta colección.</p><h3 id="diferencia-entre-get-y-onsnapshot-">Diferencia entre .get() y .onSnapshot()</h3><p>La diferencia entre los métodos get y snapshot es que get devuelve una promesa, que necesita ser resuelta, y sólo entonces obtenemos los datos de la instantánea.</p><p><code>.onSnapshot</code>, sin embargo, utiliza una función de devolución de llamada sincrónica, que nos da acceso directo a la instantánea.</p><p>Esto es importante para tener en cuenta, cuando se trata diferentes métodos - tenemos que saber cuáles de ellos devuelven una promesa y cuáles son sincrónicos.</p><h3 id="desinscripci-n-de-una-colecci-n-con-unsubscribe-">Desinscripción de una colección con unsubscribe()</h3><p>Obsérve además que <code>.onSnapshot()</code> devuelve una función que podemos utilizar para desuscribirnos y dejar el proceso en una colección determinada.</p><p>Esto es importante en los casos en los que el usuario, por ejemplo, se va de una determinada página en la que estamos mostrando los datos de una colección. Aquí hay un ejemplo, usando la librería React donde estamos llamando a cancelar la suscripción dentro del hook useEffect.</p><p>Cuando lo hagamos, nos aseguraremos que nuestro componente sea desmontado (ya no se muestre en el contexto de nuestra aplicación) ya no estaremos escuchando los datos de la colección que estamos utilizando en este componente.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function App() {
  const [libros, setLibros] = React.useState([]);

  React.useEffect(() =&gt; {
	const unsubscribe = firebase
      .firestore()
      .collection("libros")
      .onSnapshot((resultados) =&gt; {
        const datos = resultados.docs.map((doc) =&gt; ({
          id: doc.id,
          ...doc.data(),
        }));
		setLibros(datos);
      });
  }, []);
  
  return libros.map(libro =&gt; &lt;BookList key={libro.id} libro={libro} /&gt;)
}</code></pre><figcaption>Desuscribirse</figcaption></figure><h3 id="obtener-documentos-individuales-con-doc-">Obtener documentos individuales con .doc()</h3><p>Cuando se trata de obtener un documento dentro de una colección, el proceso es el mismo para obtener una colección completa: primero tenemos que crear una referencia a ese documento y luego utilizar el método <code>get</code> para tomarlo.</p><p>Sin embargo, después utilizamos el método <code>.doc()</code> encadenado al método de la colección. Para crear una referencia, necesitamos tomar este id de la base de datos si fue autogenerado. Después de eso, podemos encadenar a <code>.get()</code> y resolver la promesa.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const libroRef = firebase
  .firestore()
  .collection("libros")
  .doc("glMeZvPpTN1Ah31sKcnj");

libroRef.get().then((doc) =&gt; {
  if (!doc.exists) return;
  console.log("Document data:", doc.data());
  // Document data: { titulo: 'El gran Gatsby' }
});</code></pre><figcaption>Firebase get</figcaption></figure><p>Observe el condicional <code>if (!doc.exists) return;</code> en el código anterior.</p><p>Una vez recuperado el documento, es imprescindible comprobar si existe.</p><p>Si no lo hacemos, habrá un error al obtener los datos de nuestro documento. La forma de comprobar y ver si nuestro documento existe es diciendo, si <code>doc.exists</code>, que devuelve un valor verdadero o falso.</p><p>Si esta expresión devuelve false, queremos volver de la función o tal vez lanzar un error. Si <code>doc.exists</code> es verdadero, podemos obtener los datos de <code>doc.data</code>.</p><h3 id="a-adir-un-documento-a-una-colecci-n-con-add-">Añadir un documento a una colección con .add()</h3><p>A continuación, pasemos a cambiar los datos. La forma más sencilla de añadir un nuevo documento a una colección es con el método <code>.add()</code>.</p><p>Todo lo que tiene que hacer es seleccionar una referencia de colección (con <code>.collection()</code>) y encadenar en <code>.add()</code>.</p><p>Volviendo a nuestra definición de los documentos como objetos de JavaScript, tenemos que pasar un objeto al método <code>.add()</code> y especificar todos los campos que queremos que estén en el documento.</p><p>Digamos que queremos añadir otro libro, "De ratones y hombres":</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase
  .firestore()
  .collection("libros")
  .add({
    title: "De ratones y hombres",
  })
  .then((ref) =&gt; {
    console.log("Documento añadido con ID: ", ref.id);
    // Documento añadido con ID:  ZzhIgLqELaoE3eSsOazu
  });</code></pre><figcaption>Firebase add()</figcaption></figure><p>El método <code>.add</code> devuelve una promesa y de esta promesa resuelta, obtenemos de vuelta una referencia al documento creado, que nos da información del id creado.</p><p>El método <code>.add()</code> nos genera automáticamente un id. Ten en cuenta que no podemos utilizar esta referencia directamente para obtener datos. Sin embargo, podemos pasar la refeferencia al método doc para crear otra consulta.</p><h3 id="a-adir-un-documento-a-una-colecci-n-con-set-">Añadir un documento a una colección con .set()</h3><p>Otra forma de añadir un documento a una colección es con el método <code>.set()</code>.</p><p>La diferencia entre set y add, radica en la necesidad de especificar nuestro propio id al añadir los datos.</p><p>Esto requiere encadenar en el método <code>.doc()</code> con el id, que se quiere utilizar. Además, observa cómo cuando la promesa se resuelve desde <code>.set()</code>, no obtenemos una referencia al documento creado:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase
  .firestore()
  .collection("libros")
  .doc("otro libro")
  .set({
    title: "Guerra y paz",
  })
  .then(() =&gt; {
    console.log("Documento creado");
  });</code></pre><figcaption>Firebase set()</figcaption></figure><p>Además, cuando usamos <code>.set()</code> con un documento existente, por defecto se sobrescribirá ese documento.</p><p>Si queremos fusionar, un documento antiguo con un documento nuevo en lugar de sobrescribirlo, necesitamos pasar un argumento adicional a <code>.set()</code> y proporcionar la propiedad <code>merge</code> set a true.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">// use .set() para fusionar los datos con documentos existentes y no sobreescribirlos

const libroRef = firebase
  .firestore()
  .collection("libros")
  .doc("otro libro");

libroRef
  .set({
    author: "Lev Nikolaevich Tolstoy"
  }, { merge: true })
  .then(() =&gt; {
    console.log("Documento fusionado");
    
    libroRef
      .get()
      .then(doc =&gt; {
      console.log("Documento fusionado: ", doc.data());
      // Documento fusionado:  { titulo: 'Guerra  y paz', author: 'Lev Nikolaevich Tolstoy' }
    });
  });</code></pre><figcaption>Firebase set&nbsp;</figcaption></figure><h3 id="actualizaci-n-de-datos-existentes-con-update-">Actualización de datos existentes con .update()</h3><p>Cuando se trata de actualizar datos, utilizamos el método update, que al igual que <code>.add()</code> y <code>.set()</code> devuelve una promesa.</p><p>Lo útil de usar <code>.update()</code> es que, a diferencia de <code>.set()</code>, no sobrescribirá todo el documento. También como <code>.set()</code>, necesitamos referenciar un documento individual.</p><p>Cuando se utiliza <code>.update()</code>, es importante utilizar algún tipo de manejo de errores, como el callback <code>.catch()</code> en el caso de que el documento no exista.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const libroRef = firebase.firestore().collection("libros").doc("otro libro");

libroRef
  .update({
    year: 1869,
  })
  .then(() =&gt; {
    console.log("Documento actualizado"); // Documento actualizado
  })
  .catch((error) =&gt; {
    console.error("Error de actualización de doumento", error);
  });	</code></pre><figcaption>Firebase update</figcaption></figure><h3 id="eliminaci-n-de-datos-con-delete-">Eliminación de datos con .delete()</h3><p>Podemos eliminar una colección de documentos dada referenciándola por su id y ejecutando el método <code>.delete()</code>, así de simple. También devuelve una promesa.</p><p>Este es un ejemplo básico de eliminación de un libro con el id "otro libro":</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase
  .firestore()
  .collection("libros")
  .doc("otro libro")
  .delete()
  .then(() =&gt; console.log("Documento borrado")) // Documento borrado
  .catch((error) =&gt; console.error("Error eliminando documento", error));</code></pre><figcaption>Firebase update()</figcaption></figure><blockquote>Tenga en cuenta que la documentación oficial de Firestore no recomienda eliminar colecciones enteras, sólo documentos individuales.</blockquote><h3 id="trabajar-con-subcolecciones-colecciones-">Trabajar con subcolecciones(Colecciones)</h3><p>Supongamos que hemos dado un paso en falso al crear nuestra aplicación y en lugar de limitarnos a añadir libros queremos, también conectarlos a los usuarios que los han hecho. T</p><p>La forma en que queremos reestructurar los datos, es creando una colección llamada '<strong>usuarios</strong>' en la raíz de nuestra base de datos y que '<strong>libros</strong>' sea una subcolección de '<strong>usuarios</strong>'. Esto permitirá a los usuarios tener sus propias colecciones de libros. ¿Cómo lo configuramos?</p><p>Las referencias a la subcolección <strong>"libros"</strong> deberían tener el siguiente aspecto:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const usuarioLibrosRef = firebase
  .firestore()
  .collection('usuarios')
  .doc('user-id')
  .collection('libros');</code></pre><figcaption>Subcolecciones de colecciones</figcaption></figure><p>Observe además que podemos escribir todo esto dentro de una sola llamada a <code>.collection()</code> utilizando barras inclinadas.</p><p>El código anterior es equivalente al siguiente, donde la referencia de la colección debe tener un número impar de segmentos. Si no es así, Firestore arrojará un error.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const usuarioLibrosRef = firebase
  .firestore()
  .collection('usuarios/user-id/libros');</code></pre><figcaption>Colleción de usuarios</figcaption></figure><p>Para crear la subcolección propia, con un documento (otra novela de Steinbeck, "Al este del Edén") ejecute lo siguiente:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase.firestore().collection("usuarios/user-1/libros").add({
  titulo: "Al este del Eden",
});</code></pre><figcaption>Firestore</figcaption></figure><p>Entonces, obtener esa subcolección recién creada tendría el siguiente aspecto basado en el ID del usuario.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase
  .firestore()
  .collection("usuarios/user-1/libros")
  .get()
  .then((resultados) =&gt; {
    const datos = resultados.docs.map((doc) =&gt; ({
      id: doc.id,
      ...doc.data(),
    }));
    console.log(datos); 
    // [ { id: 'UO07aqpw13xvlMAfAvTF', titulo: 'Al este del Eden' } ]
  });</code></pre><figcaption>SuColecciones</figcaption></figure><h3 id="m-todos-tiles-para-los-campos-de-firestore">Métodos útiles para los campos de Firestore</h3><p>Hay algunas herramientas útiles que podemos tomar de Firestore, las cuales permiten trabajar con nuestros valores de campo un poco más fácil.</p><p>Por ejemplo, podemos generar una marca de tiempo<strong>(timestamp)</strong> para cada vez que se crea o actualiza un determinado documento, con el siguiente helper de la propiedad <code>FieldValue</code>.</p><p>Por supuesto, podemos crear nuestros propios valores de fecha utilizando JavaScript, pero el uso de una marca de tiempo<strong>(timestamp)</strong> del servidor, nos permite saber exactamente cuándo se modifican o crean los datos desde el propio Firestore.F</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase
  .firestore()
  .collection("usuarios")
  .doc("user-2")
  .set({
    created: firebase.firestore.FieldValue.serverTimestamp(),
  })
  .then(() =&gt; {
    console.log("Usuario añadido"); // Usuario añadido
  });</code></pre><figcaption>Firebase usuarios</figcaption></figure><p>Adicionalmente, digamos que tenemos un campo un documento que lleva la cuenta de un cierto número, digamos el número de libros de un usuario ha creado. Cada vez que un usuario crea un nuevo libro queremos incrementar su cantidad en uno.</p><p>Una forma fácil de hacer esto, en lugar de tener que hacer primero una petición <code>.get()</code>, es utilizar otro ayudante de valor de campo llamado <code>.increment()</code>:</p><pre><code class="language-js">const userRef = firebase.firestore().collection("usuarios").doc("user-2");

usuarioRef
  .set({
    count: firebase.firestore.FieldValue.increment(1),
  })
  .then(() =&gt; {
    console.log("Usuario actualizado");

    usuarioRef.get().then((doc) =&gt; {
      console.log("Datos de usuario actualizado: ", doc.data());
    });
  });
 </code></pre><h3 id="consulta-con-where-">Consulta con .where()</h3><p>¿Si queremos obtener datos de nuestras colecciones en función de determinadas condiciones? Por ejemplo, digamos que queremos obtener todos los usuarios que han enviado uno o más libros.</p><p>Podemos escribir una consulta de este tipo con la ayuda del método <code>.where()</code>. Primero referenciamos una colección y luego encadenamos en <code>.where()</code>.</p><p>El método <strong>where </strong>toma tres argumentos: en primer lugar, el campo en el que estamos <em>buscando una operación</em>, un<em> operador</em> y el <em>valor</em> sobre el que queremos <em>filtrar</em> nuestra colección.</p><p>Podemos utilizar cualquiera de los siguientes operadores y los campos que utilicemos pueden ser valores primitivos así como arrays.</p><p><code>&lt;</code>, <code>&lt;=</code>, <code>==</code>, <code>&gt;</code>, <code>&gt;=</code>, <code>array-contains</code>, <code>in</code>, or <code>array-contains-any</code></p><p>Para obtener todos los usuarios que han enviado más de un libro, podemos utilizar la siguiente consulta.</p><p>Después de <code>.where()</code> necesitamos encadenar en <code>.get()</code>. Al resolver nuestra promesa obtenemos lo que se conoce como <strong>querySnapshot</strong>.</p><p>Al igual que para obtener una colección, podemos iterar sobre el <strong>querySnapshot</strong> con <code>.map()</code> para obtener el id y los datos(campos) de cada documento:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">firebase
  .firestore()
  .collection("usuarios")
  .where("count", "&gt;=", 1)
  .get()
  .then((resConsulta) =&gt; {
    const datos = resConsulta.docs.map((doc) =&gt; ({
      id: doc.id,
      ...doc.data(),
    }));
    console.log("Usuarios con &gt; 1 libro: ", datos);
    // Usuarios con &gt; 1 libro:  [ { id: 'user-1', count: 1 } ]
  });</code></pre><figcaption>Firebase where</figcaption></figure><blockquote>Tenga en cuenta que puede encadenar en múltiples métodos <code>.where ()</code> para crear consultas compuestas.</blockquote><h3 id="limitaci-n-y-ordenaci-n-de-las-consultas">Limitación y ordenación de las consultas</h3><p>Otro método para consultar eficazmente nuestras colecciones es limitarlas. Digamos que queremos limitar una consulta determinada a una cierta cantidad de documentos.</p><p>Si, sólo queremos devolver unos pocos elementos de nuestra consulta, sólo tenemos que añadir el método <code>.limit()</code>, después de una referencia determinada.</p><p>Si, quisiéramos hacer eso a través de nuestra consulta, para obtener los usuarios que han enviado al menos un libro, sería como lo siguiente:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const usuariosRef = firebase
  .firestore()
  .collection("usuarios")
  .where("count", "&gt;=", 1);

  usuariosRef.limit(3)</code></pre><figcaption>Firebase limit()</figcaption></figure><p>Otra potente función es la de ordenar nuestros datos consultados, según los campos del documento utilizando <code>.orderBy()</code>.</p><p>Si, queremos ordenar nuestros usuarios creados por la fecha en que se hicieron por primera vez, podemos utilizar el método <code>orderBy</code>, con el campo <strong>'creado'</strong> como primer argumento. Para el segundo argumento, especificamos si debe ser en orden ascendente o descendente.</p><p>Para obtener todos los usuarios ordenados por fecha de creación del más reciente al más antiguo, podemos ejecutar la siguiente consulta:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const usuariosRef = firebase
  .firestore()
  .collection("usuarios")
  .where("count", "&gt;=", 1);

  usuariosRef.orderBy("created", "desc").limit(3);</code></pre><figcaption>Firebse orderBy()</figcaption></figure><p>Podemos encadenar <code>.orderBy()</code> con <code>.limit()</code>. Para que esto funcione correctamente, <code>.limit()</code> debe llamarse en último lugar y no antes de <code>.orderBy()</code>.</p><h2 id="-quieres-tu-propia-copia">¿Quieres tu propia copia?</h2><p>Si quieres tener esta guía para futuras consultas, <a href="https://bit.ly/2020-firestore">descarga una hoja de trucos de todo este tutorial aquí</a>.</p><p><em>Haga clic para obtener la hoja de trucos</em></p><hr><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/reed/"><strong>Reed Barger</strong></a> - <a href="https://www.freecodecamp.org/news/the-firestore-tutorial-for-2020-learn-by-example/"><strong>The JavaScript + Firestore Tutorial for 2020: Learn by Example</strong></a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
