Node.js 如何减少Firebase云函数Firestore onWrite触发器中已删除文档的数量?
在删除整个集合后,我正在努力减少包含三个子集合的父集合中的计数器。结构如下所示: 课程->{CourseID}->Sections->{SectionID}->主题->{TopicID}->练习->{ExerciseID} 用大括号包装的文档是文档的通配符 每个课程文档有三个“计数器”: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
- 节数
- 主题数
- 练习次数
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) });
}
});