Я хочу обновить два поля в документе в коллекции под названием recipes, и я использовал для этого пакетное обновление:

let recipeRef = db.collection('recipes').doc(`${recipeId}`);
let batch = db.batch();
batch.update(recipeRef, {ratingsCount : admin.firestore.FieldValue.increment(1)});
batch.update(recipeRef, {totalRating : admin.firestore.FieldValue.increment(snap.data().rating)})
return batch.commit();

И у меня есть функция триггера для коллекции recipes, например:

exports.RecipeUpdated = functions.firestore
.document('recipes/{recipeId}')
.onUpdate((change, context) => 
{
    //code
});

Мой вопрос: поскольку в вышеуказанном пакете есть два обновления, будет ли это также дважды вызывать функцию onUpdate Или, поскольку пакетная запись завершается атомарно, триггер будет вызываться только один? Я хочу, чтобы триггер вызывался только один раз.

3
Jayesh Babu 21 Окт 2019 в 10:50

1 ответ

Лучший ответ

Как упомянул @DougStevenson в своем комментарии, вам нужно просто запустить код и посмотреть, как это работает. Но обратите внимание: даже если вы используете один и тот же recipeRef, вы создаете два обновления разницы в своем пакете. В этом случае результат, который вы получите, будет заключаться в том, что onUpdate() сработает дважды.

Если вы хотите, чтобы вас вызывали только один раз, вам не следует создавать два разных обновления, вы можете создать одно. Функция update () позволяет передавать несколько свойств которые можно обновить. Если вы используете объекты, то просто получите ссылку на документ, получите его, внесите изменения и запишите обратно.

3
Alex Mamo 21 Окт 2019 в 10:01