首页 > 解决方案 > 如何在 Cloud Firestore 中使用批处理写入 500 多个文档?

问题描述

我正在尝试更新 500 多个文档,例如 1000 到 2000 个文档,我只知道如何对 500 个文档使用批处理我想问一下如何使用 cloud firestore 更新 500 多个文档。这是我尝试更新 500 个文档的方法文件。我正在尝试更新 1000 个文档的 ms_timestamp。谁能告诉我如何使用批量写入来做到这一点

const batch = db.batch();
const campSnapshot = await db
  .collection("camp")
  .where("status", "in", ["PENDING", "CONFIRMED"])
  .get();
await db.collection("camping").doc(getISO8601Date()).set({
  trigger: campSnapshot.docs.length,
});
campSnapshot.forEach((docs) => {
  const object = docs.data();
  object.ms_timestamp = momentTz().tz("Asia/Kolkata").valueOf();

  batch.set(
    db.collection("camp").doc(docs.get("campId")),

    object,
    { merge: true }
  );
});
await Promise.all([batch.commit()]);

标签: node.jsgoogle-cloud-firestoregoogle-cloud-functions

解决方案


Cloud Firestore 在执行事务或批量写入时施加了 500 个文档的限制,您无法更改此设置,但解决方法可能会奏效。

我不是网络开发专家,所以我根据我作为移动应用程序开发人员的观点分享一个建议。

  1. 创建一个集合,该集合存储有关特定集合中包含多少文档的计数器。当在该特定集合中触发事件(无论是创建、更新或删除)时,我通过 Cloud Functions/其他方法更新计数器。计数器应该是原子的且一致的,您可以在此处利用 Cloud Firestore 事务。
  2. 在执行批量写入之前获取计数器值。在这里,我会知道有多少数据/对象/文档需要更新。
  3. 创建一个初始值为0的偏移量。偏移量用于标记数据。批量写入最多只能对 500 个文档执行,所以如果我想再次对 501-1000 的文档/数据执行批量写入,那么偏移量将为 500,依此类推。
  4. 调用使用定义的偏移量递归执行批量写入的方法,直到它完全等于计数器 - 1。

我没有测试这个,因为我现在没有足够的时间,但我认为它会起作用。

不明白的可以评论,我很乐意为您提供进一步的帮助。


推荐阅读