我当前正在使用以下计划的云函数删除任何超过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);
});
});
1条答案
按热度按时间k97glaaz1#
正如Doug在他的评论和官方video series中所解释的那样,你的代码必须返回一个只有在所有异步工作完成后才能解析的promise,否则云函数将提前终止。
您可以使用
Promise.all()
如下调整代码: