javascript - 通过 Firebase 函数根据时间戳删除旧文档
问题描述
我正在尝试根据该文档的时间戳删除集合中的特定文档。我将它们设置为过时的帖子应在脚本调用时从云中删除。
问题是我无法找到一种方法来遍历集合中的所有文档,以便我可以访问这些字段并Date.now()
与post['expireDate]
.
我没有为我的项目使用实时数据库,而是使用 Firestore 云。我找到了一种在数据库中执行此操作的方法,但在云中没有,并且尝试了不同的方法来执行此操作。
exports.removeOldPosts = functions.https.onRequest((req, res) => {
const timeNow = Date.now();
let postsRef = admin.firestore().collection('accesories/').listDocuments();
postsRef.forEach(post => {
if (post['expiredDate'] < timeNow) {
post.delete();
}
})
return res.status(200).end();
});
解决方案
您正在使用listDocuments()
API,它(异步)返回文档引用列表。但是你的代码:
- 不处理调用是异步的事实。即您没有
then()
回调,如文档示例中所示。 - 假设检索到文档的数据,而
listDocuments
实际上只返回文档引用。
要解决此问题,我建议使用get()
Firebase 文档中关于从集合中获取所有文档中显示的 API 。不过,即使使用那个 API,您仍然必须自己处理异步特性,因此我建议您研究 Cloud Functions 和现代 Web API 的异步特性。Doug 的优秀博客文章为什么是 Firebase API 异步?和视频系列学习 JavaScript 承诺。
作为单独的说明:与其从数据库中读取所有文档,然后在您的代码中确定要删除哪些文档,我建议您使用查询来仅检索您要删除的文档。这会导致阅读更少的文档,从而为您节省一些document reads
和bandwidth
.
推荐阅读
- php - 电报机器人 api-php 中 sendMessage 方法中的 parse_mode
- inno-setup - 在 Inno Setup 安装向导结束时有条件地跳到自定义页面而不安装?
- mysql - 添加带有 3 个表的 COUNT(*)
- python - pandas DataFrame.to_sql 是否适用于 ipynb 文件?
- rust - 由于实验性功能,未安装 Rustlings
- html - 带环绕的内在中心对齐 div
- search - 使用 solr 进行离线聚类?
- python - 为什么当零除错误在 else 子句中但不在下面注释掉的行中时异常处理程序起作用
- c++ - 除了向后兼容性之外,还有什么理由 C++20 仍然包含 goto 作为语句?
- android-studio - 如何修复颤振 lib/main.dart 错误