Firestore更新集合中的所有文档

时间:2018-07-23 14:27:28

标签: redux google-cloud-firestore

我有一个名为用户的Firestore集合,每个用户都有一个生成的ID和字段得分:

console.log()

我使用redux-firestore,我想将所有用户的得分重置为0,例如

users 
    0e8X3VFL56rHBxxgkYOW
        score : 4
    3SeDjrgAWMmh3ranh2u
        score : 5

我无法实现,因为更新方法需要文档ID

你知道怎么做吗?

5 个答案:

答案 0 :(得分:5)

您可以获取集合中的所有文档,获取其ID并使用这些ID进行更新:

db.collection("cities").get().then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        var cityRef = db.collection("cities").doc(doc.id);

        return cityRef.update({
            capital: true
        });
    });
});

答案 1 :(得分:3)

由于某些奇怪的原因,已接受的答案(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))
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我在寻找类似解决方案时遇到了这篇文章。 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();
});