【问题标题】:Deleting old documents based on timestamp through Firebase Functions通过 Firebase 函数根据时间戳删除旧文档
【发布时间】:2020-02-27 12:10:26
【问题描述】:

我正在尝试根据该文档的时间戳删除集合中的特定文档。我将它们设置为过时的帖子应在脚本调用时从云中删除。

问题是我无法找到一种方法来遍历集合中的所有文档,以便我可以访问这些字段并将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();
});

【问题讨论】:

    标签: javascript node.js firebase google-cloud-firestore


    【解决方案1】:

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

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

    要解决这个问题,我建议使用 getting all documents from a collection 上的 Firebase 文档中显示的 get() API。不过,即使使用那个 API,您仍然必须自己处理异步特性,因此我建议您研究 Cloud Functions 和现代 Web API 的异步特性。 Doug 的优秀博文Why are the Firebase API asynchronous? 和视频系列Learn JavaScript Promises 是一个入门的地方。


    作为单独的说明:不要从数据库中读取所有文档,然后在您的代码中确定要删除哪些文档,我建议using a query 仅检索您要删除的文档。这会导致阅读更少的文档,从而为您节省document readsbandwidth 的一些成本。

    【讨论】:

    • 谢谢,我会尽快试用
    • 它现在就像魔术一样,谢谢你的详细回答,这是我第一次使用JS,我不知道你可以在云上做异步编程,这是我第一个错误开头:)
    猜你喜欢
    • 2021-11-15
    • 2021-09-26
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2021-08-23
    相关资源
    最近更新 更多