首页 > 解决方案 > 通过 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();
});

标签: javascriptnode.jsfirebasegoogle-cloud-firestore

解决方案


您正在使用listDocuments()API,它(异步)返回文档引用列表。但是你的代码:

  • 不处理调用是异步的事实。即您没有then()回调,如文档示例中所示。
  • 假设检索到文档的数据,而listDocuments实际上只返回文档引用

要解决此问题,我建议使用get()Firebase 文档中关于从集合中获取所有文档中显示的 API 。不过,即使使用那个 API,您仍然必须自己处理异步特性,因此我建议您研究 Cloud Functions 和现代 Web API 的异步特性。Doug 的优秀博客文章为什么是 Firebase API 异步?和视频系列学习 JavaScript 承诺


作为单独的说明:与其从数据库中读取所有文档,然后在您的代码中确定要删除哪些文档,我建议您使用查询来仅检索您要删除的文档。这会导致阅读更少的文档,从而为您节省一些document readsbandwidth.


推荐阅读