Как уменьшить количество удаленных документов в триггерах Firestore onWrite функции Firebase Cloud? - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь уменьшить счетчик в родительской коллекции из трех подколлекций после удаления всей коллекции. Структура построена следующим образом:

курсы -> {CourseID} -> Разделы -> {SectionID} -> Темы -> {TopicID} -> Упражнения -> {ExerciseID}

Документы завернутые в фигурные скобки, являющиеся подстановочными знаками для документов.

Каждый документ курса имеет три "счетчика":

  • numberOfSections
  • numberOfTopics
  • numberOfExercises

Счетчики обновляются тремя различными облачными функциями (sectionWriteListener, topicWriteListener и exerciseWriteListener), которые имеют одинаковую структуру:

exports.sectionWriteListener =
    functions.region('europe-west1').firestore.document('courses/{courseID}/sections/{sectionID}')
        .onWrite((change, context) => {

            const courseID = context.params.courseID;

            if (!change.before.exists) {
                // New doc, increment count

                return db.collection('courses').doc(courseID).update({ numberOfSections: admin.firestore.FieldValue.increment(1) });

            } else if (change.before.exists && change.after.exists) {
                // Just updating

            } else if (!change.after.exists) {
                // Deleting Doc, decrement count

                return db.collection('courses').doc(courseID).update({ numberOfSections: admin.firestore.FieldValue.increment(-1) });

            }
        });

onWrite автоматически запускаются после того, как коллекция или ее дочерние документы изменены, но, насколько мне известно, не срабатывает, когда ее дочерняя документация имеет подколлекцию.

Это приводит к следующей проблеме: При удалении Topi c, numberOfTopics в документе CourseID действительно уменьшается на единицу, однако numberOfExercises не уменьшается, хотя упражнения в топи c также были удалены.

Буду очень признателен, если кто-нибудь сможет мне помочь с этим. Заранее спасибо!

РЕДАКТИРОВАТЬ: Вот облачная функция для добавления / удаления упражнений (не запускается при удалении родительского topi c):

exports.exerciseWriteListener =
    functions.region('europe-west1').firestore.document('courses/{courseID}/sections/{sectionID}/topics/{topicID}/exercises/{exerciseID}')
        .onWrite((change, context) => {

            const courseID = context.params.courseID;

            if (!change.before.exists) {
                // New document Created : add one to count
                let ref = db.collection('courses').doc(courseID);
                let action = { numberOfExercises: admin.firestore.FieldValue.increment(1) };

                // Add one to Count in Course
                return ref.update(action);

            } else if (change.before.exists && change.after.exists) {
                // Updating existing document : Do nothing

            } else if (!change.after.exists) {

                return db.collection('courses').doc(courseID).update({ numberOfExercises: admin.firestore.FieldValue.increment(-1) });

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