Запустить пакет или транзакцию в облачном хранилище Firestore onCreate - PullRequest
2 голосов
/ 05 марта 2019

Давайте представим, что в пожарном магазине у меня есть коллекция документов поставщика:

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 :)

1 Ответ

0 голосов
/ 07 марта 2019

Партия вообще не изменит вашу ситуацию здесь.Пакетная запись одного документа ничем не отличается от обычной записи одного документа.Все, что нужно сделать пакету - это убедиться, что все записи документов выполняются атомарно, и все они вступают в силу в один и тот же момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...