Я пытаюсь уменьшить счетчик в родительской коллекции из трех подколлекций после удаления всей коллекции. Структура построена следующим образом:
курсы -> {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) });
}
});