让我们想象一下,在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 :)
答案 0 :(得分:0)
此批次完全不会改变您的情况。批量写入一个文档与正常写入一个文档没有什么不同。批处理的全部工作就是确保所有文档的写入都是原子发生的,并且都在同一时刻生效。