在Cloud Firestore onCreate触发器上运行批处理或事务

时间:2019-03-05 12:02:49

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions

让我们想象一下,在Firestore中,我有一些供应商文档:

vendors : {
  vendor1: {
    id: "vendor1",
    name: "John",
    shopId: "shop1"
  },
  vendor2: {
    id: "vendor2",
    name: "Mary",
    shopId: "shop2"
  }
}

以及商店文件的集合:

shops : {
  shop1: {
    id: "shop1",
    name: "My Super shop - City A",
    vendors : {
      vendor1: {
        id: "vendor1",
        name: "John"
  },
  shop2: {
    id: "shop2",
    name: "My Super shop - City B",
    vendors : {
      vendor2: {
        id: "vendor2",
        name: "Mary"
  }
}

对于阅读表演,每个商店文档都有其供应商的副本。我只复制视图(移动应用程序)中所需的供应商数据,并且如果在供应商集合上启动了onUpdate触发器,则会更新商店文档中的供应商数据。

今天,我要做的是:

exports.updatesOnCreateVendor = functions
  .firestore.document("vendors/{vendorId}")
  .onCreate(async snapshot => {
    const vendor = snapshot.data();

    const { shopId } = vendor;

    const shopRef = db.collection("shops").doc(shopId);

    const shopAfter = {
      vendors: {}
    };

    shopAfter.vendors[vendorId] = { ...vendor };

    const batch = db.batch();

    batch.set(shopRef, shopAfter, { merge: true });

    return batch
           .commit()
           .then(console.log)
           .catch(console.error);
  });

如果云功能失败(并且我不想在云功能上进行重试),我不想丢失此副本。 (对onUpdate的约束相同)。 阅读文档后,我得出结论认为,使用批处理或事务处理将确保如果25次尝试后仍未成功,它将重试。

因此,我想知道在云功能触发器上使用批处理/事务是否是最佳实践?

如果我仅使用shopRef.set(shopAfter, { merge: true })进行重构并替换批处理过程,并且如果云功能失败,那是怎么回事? (我想我会丢失我的副本:p)

感谢您的宝贵时间,以帮助我更好地了解Firebase :)

1 个答案:

答案 0 :(得分:0)

此批次完全不会改变您的情况。批量写入一个文档与正常写入一个文档没有什么不同。批处理的全部工作就是确保所有文档的写入都是原子发生的,并且都在同一时刻生效。