Rumah > Soal Jawab > teks badan
Saya cuba memadamkan dokumen yang nilainya (cap masa) melepasi 2 jam. Saya perlu memanggil onSnapshot() tetapi bukan snapshot.foreach() . Disemak melalui console.log Called1 muncul pada konsol, tetapi Called2 tidak. Saya tertanya-tanya mengapa ia tidak dipanggil untuk memadam dokumen.
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粉3005417982024-01-30 00:29:26
Dalam Cloud Firestore, setiap nilai medan diisih dalam indeks berdasarkan nilainya. Khususnya, nilai berangka diisih lebih awal dalam indeks nilai daripada nilai Timestamp
值。您对 where("Date", "<", cutoffTimestamp)
的查询将始终返回 0 个结果,因为它试图查找小于给定数字的 Timestamp
.
Untuk membetulkan ini, anda perlu menukar objek Timestamp
或 Date
值传递到 where()
过滤器。如果您选择使用 Date
, yang akan disiri secara automatik oleh SDK kepada objek Cap Waktu . Ini membolehkan anda menggunakan apa yang anda rasa selesa.
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) );
Selain itu, daripada merekodkan "Pembidaan 1" dan "Pembidaan 2", cuba yang berikut:
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)); }); });