Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何减少Firebase云函数Firestore onWrite触发器中已删除文档的数量?_Node.js_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Node.js 如何减少Firebase云函数Firestore onWrite触发器中已删除文档的数量?

Node.js 如何减少Firebase云函数Firestore onWrite触发器中已删除文档的数量?,node.js,firebase,google-cloud-firestore,google-cloud-functions,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,在删除整个集合后,我正在努力减少包含三个子集合的父集合中的计数器。结构如下所示: 课程->{CourseID}->Sections->{SectionID}->主题->{TopicID}->练习->{ExerciseID} 用大括号包装的文档是文档的通配符 每个课程文档有三个“计数器”: 节数 主题数 练习次数 计数器由三个不同的云函数更新(sectionWriteListener、topicWriteListener和exerciseWriteListener),它们的结构都类似: exp

在删除整个集合后,我正在努力减少包含三个子集合的父集合中的计数器。结构如下所示:

课程->{CourseID}->Sections->{SectionID}->主题->{TopicID}->练习->{ExerciseID}

用大括号包装的文档是文档的通配符

每个课程文档有三个“计数器”:

  • 节数
  • 主题数
  • 练习次数
计数器由三个不同的云函数更新(
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
一旦集合或其子文档被修改,就会自动触发,但据我所知,在其子文档子集合被修改时不会触发

这会导致以下问题: 删除主题时,
CourseID
文档中的
numberOfTopics
确实会递减一,但是
numberOfExercises
不会递减,尽管主题中的练习也已被删除

如果有人能帮我解决这个问题,我将不胜感激。 提前谢谢你

编辑: 以下是用于添加/删除练习的云函数(删除父主题时不会触发):


实现这一点的常用方法是添加一个云函数,该函数在添加或删除练习时触发。您不这样做/不能这样做有什么具体原因吗?我有一个云函数,其结构与示例
exports.exerciseWriteListener
中的云函数相同。但是,当我删除一个主题(或者一个部分,就这一点而言)时,它不会被触发。我已经在问题中添加了我的
exerciseWriteListener
Cloud函数。实现这一点的常用方法是添加一个在添加或删除练习时触发的Cloud函数。您不这样做/不能这样做有什么具体原因吗?我有一个云函数,其结构与示例
exports.exerciseWriteListener
中的云函数相同。但是,当我删除一个主题(或者一个部分,就这一点而言)时,它不会被触发。我已将我的
exerciseWriteListener
云函数添加到问题中。
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) });

            }
        });