【问题标题】:Change fields of documents in a collection Firestore periodically - Cloud Functions定期更改集合 Firestore 中文档的字段 - Cloud Functions
【发布时间】:2021-05-06 04:11:32
【问题描述】:

我有一个这样的数据库结构:

Posts(collection) -> userID (document) -> Subposts (subcollection) -> document[isVisible: true]

我们有不同的用户 ID,这意味着每个用户 ID 都有一个不同帖子的子集合。

我想设置一个云功能,它会定期(每 2 分钟)检查所有子集合(Subposts)中的所有文档,如果字段 isVisibletrue,则将其更改为 false

这就是我所做的:

exports.changeIsVisibleFieldAfterDay = functions.pubsub
    .schedule("every 2 minutes").onRun((context) => {
      db.collection("Posts/{uid}/Subposts").get().then((snapshot) => {
        if (snapshot.data().isVisible == true) {
          snapshot.forEach((doc) => doc.update({isVisible: false}));
        }
      });
    });

我设置了 {uid} 通配符,因为我需要签入每个文档子集合(Subposts)。

这个实现似乎不起作用。

【问题讨论】:

    标签: javascript google-cloud-firestore google-cloud-functions


    【解决方案1】:

    对于 firestore 查询,您必须提供有效的 documentID。

    如果您想检查所有用户的子集合,几乎没有其他方法可以完成!

    1. 使用集合查询
    • 查询Posts 集合> 遍历用户
    • 使用每个用户的有效文档 ID 查询 Subposts > 遍历子帖子文档
    • 根据条件使用{isVisible: false} 更新文档
    1. 使用collectionGroup查询
    • Subposts 集合使用collectionGroup 查询。这将返回每个用户的所有子帖子
    • 遍历文档并根据条件使用{isVisible: false} 进行更新

    在您的迭代 sn-p 中,集合查询返回 QuerySnapshot,在此迭代应该在字段 docs 上,如下所示

    snap.docs.forEach((doc) => {
        if (doc.data().isVisible == true) {
            doc.update({ isVisible: false });
        }
    });
    

    注意:我更喜欢使用 for..loop 而不是 .then() 的 async/await,因为 forEach 不会通过其内部的 await 调用给出预期的结果。

    【讨论】:

    • 谢谢,如果 Posts 和 Subposts 集合保持不变,但它们后面的 documentID 改变了如何实现集合组查询?这是正确的实施吗? const querySnapshot = await db.collectionGroup('Subposts').where('isVisible', '==', 'true').get(); querySnapshot.forEach((doc) => { console.log(doc.id, ' => ', doc.data()); });无论父文档 userId 是什么,这都会查看所有子集合(Subposts)吗?
    • 好的,我稍后会测试它,如果它有效,则将答案标记为正确
    猜你喜欢
    • 2018-03-16
    • 2018-09-16
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2018-03-22
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多