Maison  >  Questions et réponses  >  le corps du texte

snapshor.foreach() n'est pas appelé dans Firebase Cloud Firestore v9

J'essaie de supprimer des documents dont la valeur (horodatage) est supérieure à 2 heures. Je dois appeler onSnapshot() mais pas snapshot.foreach() . Vérifié via console.log ; Called1 apparaît sur la console, mais pas Called2. Je me demande pourquoi il n'est pas appelé pour supprimer le document.

onMounted(() => {
    const itemsCollectionRef = collection(db, "Bookings");
    const cutoffTimestamp = Date.now() - 2 * 60 * 60 * 1000; // Two hours ago
    const oldItemsQuery = query(
      itemsCollectionRef,
      where("Date", "<", cutoffTimestamp)
    );

    onSnapshot(oldItemsQuery, (snapshot) => {
      console.log('called1');
      snapshot.forEach((doc) => {
        // Delete the document
        console.log('called2');
        db.collection("Bookings").doc(doc.id).delete();
      });
    });
  })

P粉041758700P粉041758700264 Il y a quelques jours501

répondre à tous(1)je répondrai

  • P粉300541798

    P粉3005417982024-01-30 00:29:26

    Dans Cloud Firestore, chaque valeur de champ est triée dans l'index en fonction de sa valeur. En particulier, les valeurs numériques sont triées plus tôt dans l'index de valeur que les valeurs Timestamp 值。您对 where("Date", "<", cutoffTimestamp) 的查询将始终返回 0 个结果,因为它试图查找小于给定数字的 Timestamp.

    Pour corriger cela, vous devez convertir l'objet TimestampDate 值传递到 where() 过滤器。如果您选择使用 Date, qui sera automatiquement sérialisé par le SDK en un objet Timestamp . Cela vous permet d’utiliser ce avec quoi vous vous sentez à l’aise.

    const cutoffTimestamp = Timestamp.fromMillis(Date.now() - 2 * 60 * 60 * 1000); // Two hours ago
    // or const cutoffDate = new Date(Date.now() - 2 * 60 * 60 * 1000);
    const oldItemsQuery = query(
      itemsCollectionRef,
      where("Date", "<", cutoffTimestamp)
    );

    De plus, au lieu d'enregistrer « Bidding 1 » et « Bidding 2 », essayez ce qui suit :

    onSnapshot(oldItemsQuery, (snapshot) => {
      console.log(`Found ${snapshot.size} documents older than 2h`);
      snapshot.forEach((doc) => {
        // Delete the document
        console.log(`Requesting #${doc.id} be deleted…`);
        deleteDoc(doc.ref) // <-- Modern Firebase SDK equivalent of ref.delete()
          .then(() => console.log(`Deleted #${doc.id} successfully.`))
          .catch((err) => console.error(`Failed to delete #${doc.id}`, err));
      });
    });

    répondre
    0
  • Annulerrépondre