如何使用Google Cloud Function有效地删除旧的Firebase Cloud文档?

i5desfxk  于 2023-03-31  发布在  Go
关注(0)|答案(1)|浏览(169)

我当前正在使用以下计划的云函数删除任何超过24小时的工作分配或职责(文档)。该函数工作正常,并且文档已成功删除。
然而,该函数报告了大量的读取。似乎 * 每一个 * 分配或职责都被“读取”,不管它是否需要删除。我的理解是,查询确实算作阅读,除非它们在所使用的querySnapshot中返回一个文档?例如,任何被删除的文档都会有一个READ和DELETE。
有没有人知道如何优化它,只读取必须删除的文档?或者有没有更简单的方法来删除旧的Cloud Firebase文档使用谷歌云功能?我认为这是一个非常常见的事情。

更新#2与collectionGroup和正确使用的承诺(感谢您的帮助!)

同样的问题:当函数运行时,它显示844次读取和1次删除。绝对没有其他来源阅读数据。峰值仅在运行函数后发生(使用Google Cloud Scheduler - Run Now)
有趣的是,如果没有要删除的文档,则没有记录读取。但是如果有〉1个要删除的文档,则有数百个读取。目前整个集合中只有大约120个职责!似乎每个职责都被读取多次!?

谢谢!

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);
            });
    });
k97glaaz

k97glaaz1#

正如Doug在他的评论和官方video series中所解释的那样,你的代码必须返回一个只有在所有异步工作完成后才能解析的promise,否则云函数将提前终止。
您可以使用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);
            });
    });

相关问题