Давайте представим, что в пожарном магазине у меня есть коллекция документов поставщика:
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);
});
Я не хочу потерять эту копию, если облачная функция завершилась неудачей (и я не хочу активных повторных попыток в облачных функциях).(то же ограничение на обновление).Прочитав документацию, я пришел к выводу, что использование пакета или транзакции обеспечит повторную попытку, если не удастся после 25 попыток.
Итак, я хотел бы знать, рекомендуется ли использовать пакет /транзакция, подобная этой, в облачной функции запускается?
Если я произвожу рефакторинг этого и заменим пакетный процесс, просто используя shopRef.set(shopAfter, { merge: true })
, и если облачная функция потерпела неудачу, что происходит?(Думаю, я потеряю свою копию: p)
Спасибо за потраченное время, чтобы помочь мне лучше понять Firebase :)