es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminación en FireStore (Última captura)

Tengo una tabla de datos Like this y quiero eliminar todos los documentos dentro de la colección antes de invocar loadCheckOut.
¿Cómo puedo hacer eso con la sintaxis más reciente de JS?
Estoy usando React JS y inicializo la base de datos desde el método getDb(), por lo que los métodos como db.collection() no funcionan en ella. Quiero una solución modular completa.

const loadCheckout = async (priceId) => {
    // antes de añadir, debemos eliminar la colección existente
    const docRef_x = collection(db, `customers/${user.uid}/checkout_sessions`);
    const snapshot = await getDocs(docRef_x);
    const x = await deleteDoc(snapshot);

    const docRef = await addDoc(
      collection(db, `customers/${user.uid}/checkout_sessions`),
      {
        price: priceId,
        success_url: window.location.origin,
        cancel_url: window.location.origin,
      }
    );
    const ref = collection(db, `customers/${user.uid}/checkout_sessions`);
    const snap = onSnapshot(
      ref,
      { includeMetadataChanges: true },
      async (doc) => {
        var error = null,
          sessionId = null;
        var first = true;
        doc.forEach((ele) => {
          if (first) {
            error = ele.data().error;
            sessionId = ele.data().sessionId;
            first = false;
          }
        });
        console.log(sessionId);
        if (error) {
          alert(error);
        }
        if (sessionId) {
          const stripe = await loadStripe(stripe_public_key);
          stripe.redirectToCheckout({ sessionId });
        }
      }
    );
  };
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para eliminar cada documento dentro de una colección antes de llamar a la función loadCheckOut utilizando la última sintaxis de JS, puedes utilizar el siguiente enfoque:

    1. Importa los módulos necesarios:
    import { deleteDocs, collection, getDocs } from "firebase/firestore";
    import { getDb } from "./utils/firebase";
    
    1. Inicializa la base de datos de Firestore utilizando el método getDb:
    const db = getDb();
    
    1. Define una función asíncrona llamada deleteCollection que tome una referencia de la colección como argumento y elimine todos los documentos en ella utilizando una operación por lotes:
    const deleteCollection = async (collectionRef) => {
      const batchSize = 500;
      let query = collectionRef.orderBy("__name__").limit(batchSize);
    
      while (true) {
        const snapshot = await query.get();
    
        if (snapshot.size === 0) {
          break;
        }
    
        const batch = db.batch();
        snapshot.docs.forEach((doc) => batch.delete(doc.ref));
        await batch.commit();
      }
    };
    
    1. Llama a la función deleteCollection antes de la función loadCheckOut:
    const loadCheckout = async (priceId) => {
      const docRef_x = collection(db, `customers/${user.uid}/checkout_sessions`);
      await deleteCollection(docRef_x);
    
      // Resto del código de la función
    };
    

    Esto asegurará que la colección esté vacía antes de agregar nuevos documentos.

Comments are closed.