javascript - 如何使用 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 个职责!似乎每个职责都被阅读了多次!?
谢谢!
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 在他的评论和官方视频系列中解释的那样,您的代码必须返回一个仅在所有异步工作完成后才解析的 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);
});
});
推荐阅读
- html - Flask Html/jinja2中的日期格式?
- json - 如何使用 URLSession 将此 JSON 数据作为 HTTP 正文发布?
- postgresql - Postgres 是否再次将 JSON 键从 jsonb 列不必要地转换为文本?
- linux - 为什么GIC中断控制器地址不固定
- reactjs - 带有 CSSTransition 组件的 findDOMNode 警告
- android - 如何在离子4中显示不超过两行
- node.js - 从 MongoDB 加载缓慢的图像
- java - 为什么我的 contains 函数没有检测到元素?
- .net - 我可以提高这个 CSV 导入查询的性能吗?
- reactjs - 从另一个文本元素内部更改一个文本元素的样式