首页 > 解决方案 > 如何使用 Google Cloud Function 有效删除旧的 Firebase Cloud 文档?

问题描述

我目前正在使用以下预定的云功能来删除超过 24 小时的任何分配或职责(文档)。该功能工作正常,文档成功删除。

但是,该函数正在报告大量读取。似乎每一项任务或职责都在“阅读”,无论是否需要删除。我的理解是查询确实算作阅读,除非它们在使用的 querySnapshot 中返回一个文档?EG 任何被删除的文件都会有一个READ 和DELETE。

有谁知道如何优化它以仅读取必须删除的文档?或者有没有更简单的方法可以使用 Google Cloud Function 删除旧的 Cloud Firebase 文档?我原以为这是一件很常见的事情。

* 使用 collectionGroup 更新 #2 并正确使用 Promises(感谢您的帮助!)*

同样的问题:当函数运行时,它显示 844 Reads 和 1 Delete。绝对没有其他来源读取数据。峰值仅在运行函数后立即发生(使用 Google Cloud Scheduler - 立即运行)

有趣的是,如果没有要删除的文档,那么就没有记录读取。但是如果有 > 1 个文档要删除,则有数百个 Reads。目前整个系列中只有大约 120 个职责!似乎每个职责都被阅读了多次!?

函数运行后立即读取 Spike

在此处输入图像描述

谢谢!

exports.scheduledCleanOldDutiesCollection = functions.pubsub.schedule('0 3 * * *')
    .timeZone('America/Chicago')
    .onRun((context) => {
        const dateYesterday = new Date(new Date().getTime() - (24 * 60 * 60 * 1000));   // 24 hours
        return db.collectionGroup('duties').where('date', '<', dateYesterday).get()
            .then(querySnapshot => {
                const promises = [];
                querySnapshot.forEach(doc => {
                    promises.push(doc.ref.delete());
                });
                return Promise.all(promises);
            });
    });

标签: javascriptnode.jsfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


正如 Doug 在他的评论和官方视频系列中解释的那样,您的代码必须返回一个仅在所有异步工作完成后才解析的 Promise,否则 Cloud Function 将提前终止。

您可以使用以下方式调整您的代码Promise.all()

exports.scheduledCleanOldDutiesCollection = functions.pubsub.schedule('0 3 * * *')
    .timeZone('America/Chicago')
    .onRun((context) => {
        const dateYesterday = new Date(new Date().getTime() - (24 * 60 * 60 * 1000));   // 24 hours
        return db.collectionGroup('duties').where('date', '<', dateYesterday).get()
            .then(querySnapshot => {
                const promises = [];
                querySnapshot.forEach(doc => {
                    promises.push(doc.ref.delete());
                });
                return Promise.all(promises);
            });
    });

推荐阅读