【问题标题】:Firestore update all documents in collectionsFirestore 更新集合中的所有文档
【发布时间】:2018-12-31 01:08:07
【问题描述】:

我有一个名为 users 的 firestore 集合,每个用户都有一个带有字段 score 的生成 id:

users 
    0e8X3VFL56rHBxxgkYOW
        score : 4
    3SeDjrgAWMmh3ranh2u
        score : 5

我使用 redux-firestore,我想将所有用户的分数重置为 0,类似于

firestore.update({ collection: 'users' }, { score : 0 }

我无法做到这一点,因为更新方法需要一个文档 ID

你知道怎么做吗?

【问题讨论】:

    标签: javascript redux google-cloud-firestore


    【解决方案1】:

    我在寻找类似解决方案时遇到了这篇文章。 Firestore 现在有batched writes,它将一次性更新所有文档。对于较少的文档,这可能是一个理想的解决方案。

    更新@thehamzarocks 的答案:

    const batch = db.batch()
    
    db.collection('cities').get().then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            const docRef = db.collection('cities').doc(doc.id)
            batch.update(docRef, { capital: true })
        });
    
        batch.commit();
    });
    

    【讨论】:

    • 每次批量限制为500个文档
    【解决方案2】:

    您可以获取集合中的所有文档,获取它们的 id 并使用这些 id 执行更新:

    db.collection("cities").get().then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            doc.ref.update({
                capital: true
            });
        });
    });
    

    【讨论】:

    • 我的集合中有大约 100 万个文档,我想更新所有文档中的一个属性。最好的方法是什么? 100 万份文档,数千名用户实时使用该应用程序。我想阅读所有这些并更新将花费大量的读写。
    • @RobertWilliams 那么你做了什么?我在类似的船上
    • @AbdulrahmanAbdelkader 除了这个答案所暗示的以外,别无他法。我必须阅读所有文档并使用循环进行更新。
    • @RobertWilliams 非常感谢!由于评论很旧,没想到会得到回复,但我认为这也是我会做的,因为没有别的东西了?但是,您是否建议使用云功能或您有其他解决方案
    • 这取决于你的目标是什么。在我的情况下,我在一个集合中有数百万个文档,我想要一个快速修复,所以我没有部署 firebase 函数,而是编写了一些代码来获取每个请求和更新的 500 个文档,然后获取下一个 500 个并更新它们。我没有尝试 firebase 功能,因为我对它们了解不多,而且我担心它可能会增加我的 firebase 账单。
    【解决方案3】:

    批量更新很不错,但请记住,每个事务仅限于 500 个文档更新。 如果不经常进行此重置,可能最简单的方法是:

    async function resetScores() {
      const collection = await db
        .collection("users")
        .get()
      collection.forEach(doc=> {
        doc.ref
          .update({
            score: 0
          })
      })
    }
    

    【讨论】:

      【解决方案4】:

      由于某种奇怪的原因,接受的答案 (thehamzarocks) 对我不起作用,没有更新任何文档。也许AngularFire2中有一个错误。无论如何,我决定循环遍历 QuerySnapshot 的 docs 数组,而不是使用它的 forEach 方法,并将每个更新添加到批处理队列中。批处理批量操作也比为每个更新操作发送新的更新请求更有效。

      resetScore(): Promise<void> {
        return this.usersCollectionRef.ref.get().then(resp => {
          console.log(resp.docs)
          let batch = this.afs.firestore.batch();
      
          resp.docs.forEach(userDocRef => {
            batch.update(userDocRef.ref, {'score': 0, 'leadsWithSalesWin': 0, 'leadsReported': 0});
          })
          batch.commit().catch(err => console.error(err));
        }).catch(error => console.error(error))
      }
      

      【讨论】:

        【解决方案5】:

        Firestore 无法在不知道文档 ID 的情况下批量更新文档。您必须以某种方式知道要更新的每个文档的文档 ID(执行查询或批量查询),并单独更新每个文档。

        【讨论】:

          猜你喜欢
          • 2020-10-03
          • 2020-08-25
          • 2021-05-12
          • 1970-01-01
          • 2020-09-08
          • 2018-05-09
          • 2018-11-01
          相关资源
          最近更新 更多