我目前正在使用以下计划的云功能来删除超过 24 小时的任何分配或职责(文档)。功能正常,文档删除成功。
但是,该函数正在报告大量的读取。似乎每一项任务或职责都被“读取”,无论它是否需要删除。据我了解,查询确实算作阅读,除非它们返回所使用的 querySnapshot 中的文档?例如。任何被删除的文档都会有一个读取和删除。
有谁知道如何优化它以仅读取必须删除的文档?或者是否有更简单的方法使用 Google Cloud Function 删除旧的 Cloud Firebase 文档?我本以为这是一件很常见的事情。
* 使用 collectionGroup 更新了 #2 并正确使用了 Promise(感谢您的帮助!)*
同样的问题:当函数运行时,显示 844 个读取和 1 个删除。绝对没有其他来源读取数据。峰值仅在运行该函数后立即发生(使用 Google Cloud Scheduler - 立即运行)
有趣的是,如果没有要删除的文档,则不会记录任何读取。但如果有 > 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);
});
});
最佳答案
正如 Doug 在他的评论和官方 video series 中所解释的那样,您的代码必须返回一个只有在所有异步工作完成后才能解析的 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);
});
});
关于javascript - 如何使用 Google Cloud Function 高效删除旧的 Firebase Cloud 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60824825/