我当前正在使用以下计划的Cloud Function删除任何早于24小时的任务或职责(文档)。该功能运行正常,文档成功删除。
该功能报告的读取次数很大。似乎每一个任务或职责正在“读取”,无论是否需要删除它。据我了解,查询确实算作阅读,除非它们在querySnapshot中返回使用的文档?例如。任何要删除的文档都将具有READ和DELETE。
有人知道如何优化此方法以仅读取必须删除的文档吗?还是有使用Google Cloud Function删除旧Cloud Firebase文档的简便方法?我本以为这是一件很平常的事情。
*使用collectionGroup更新#2,并正确使用Promises(感谢您的帮助!)*
相同的问题:运行该函数时,它显示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);
});
});
答案 0 :(得分:3)
正如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);
});
});