【问题标题】:Bulk Update using Batched Write of Firebase with conditions (using WHERE function)批量更新使用带条件的 Firebase 批量写入(使用 WHERE 函数)
【发布时间】:2021-09-04 14:19:50
【问题描述】:

我的系统的主要目标是在经过身份验证的用户更改或重命名他或她的帐户名称时更新在我的论坛上发帖的用户的名称。

整个过程没有错误,但不幸的是,在论坛发帖的其他用户也更新了他们的名字。

所以这是输出:

我尝试以下方法:

  1. 我使用 Firebase 中的 WHERE 函数来过滤用户发布的帖子(登录用户本身)。不知道为什么整个过程都失败了。

这是sn-p代码。

  async updateAll(username) {
    const batch = this.afs.firestore.batch();

    // cUser is the USER ID
    const userRef = this.afs
      .collection('post', (ref) => ref.where('postedById', '==', this.cUser))
      .ref.get();
    (await userRef).forEach((element) => {
      batch.update(element.ref, {
        postedBy: username,
      });
    });

    return batch.commit();
  }

【问题讨论】:

    标签: javascript firebase google-cloud-firestore angularfire2


    【解决方案1】:

    您以.ref.get() 结束查询。那里的.ref 实际上会返回您运行查询的集合,因此您最终会加载整个post 集合。

    您可以改为subscribe to snapshotChanges,或者只使用常规的 JavaScript SDK 来完成此操作(因为您不直接访问 UI,我通常会发现这更容易):

    const userRef = firebase.firestore()
      .collection('post').where('postedById', '==', this.cUser).get();
    (await userRef).forEach((element) => {
      batch.update(element.ref, {
        postedBy: username,
      });
    });
    

    【讨论】:

    • 感谢您的回答,我的代码现在还可以。但是我还有一个问题,如果用户在论坛中没有帖子怎么办?因为不幸的是,如果用户更改他或她的名字而不在论坛上发帖,问题仍然存在。但总而言之,如果用户在论坛中发帖,上述代码都可以正常工作。
    • 我不确定我是否理解那里的新问题。如果用户没有任何帖子,我的答案中的代码不会更新任何帖子,这对我来说似乎是正确的行为。这不就是你想要的吗?
    • 首先我认为先生,但如果用户根本没有帖子,问题就会再次出现。是的,先生,代码运行良好(如果用户在论坛上有帖子)。
    • 先生更新代码,我猜我解决了。如果我使用element.exists,并且在帖子集合中已经检测到用户 ID,则代码将运行。我希望这是解决问题的好方法。
    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 2022-10-16
    • 1970-01-01
    • 2014-02-16
    • 2011-09-29
    • 2011-04-15
    • 2020-12-01
    相关资源
    最近更新 更多