Firestore onCreate 触发器包含最新数据还是仅包含创建期间提交的数据?
Is Firestore onCreate trigger contains the latest data or only the data submitted during creation?
我有一个评论系统,我需要跟踪评论的数量。我正在考虑使用 onCreate
触发器来跟踪创建评论时的评论数。
我知道 onCreate
触发器可以被调用多次,因此,为了使函数幂等,我正在查看以下实现:
functions.firestore.document('users/{userId}/comments/{commentId}').onCreate(async (snap, context) => {
const data = snap.data()
if (data.counted) {
return
}
db.doc(`commentCounter/${userId}`).update({
value: admin.firestore.FieldValue.increment(1)
})
snap.ref.update({ counted: true })
}
这行得通吗?主要问题是 snap
中的数据是否反映了 firestore 中的当前数据,或者是文档创建期间的唯一数据。谢谢你的时间。
onCreate
函数使用创建文档时创建的数据触发。如果在文档创建时间和您的 Cloud Functions 运行时间之间有更新,它将不会包含在传递给您的代码的快照中。
如果您希望 Cloud Functions 中的 increment
是自文档创建以来可能发生的任何增量的补充,那么使用 increment
是正确的解决方案。
另一方面,如果您希望文档由 Cloud Function 初始化并且在此之前没有其他写入,您可能希望使用安全规则来拒绝那些早期写入,例如基于marker/flag Cloud Function 然后写入的字段。
我有一个评论系统,我需要跟踪评论的数量。我正在考虑使用 onCreate
触发器来跟踪创建评论时的评论数。
我知道 onCreate
触发器可以被调用多次,因此,为了使函数幂等,我正在查看以下实现:
functions.firestore.document('users/{userId}/comments/{commentId}').onCreate(async (snap, context) => {
const data = snap.data()
if (data.counted) {
return
}
db.doc(`commentCounter/${userId}`).update({
value: admin.firestore.FieldValue.increment(1)
})
snap.ref.update({ counted: true })
}
这行得通吗?主要问题是 snap
中的数据是否反映了 firestore 中的当前数据,或者是文档创建期间的唯一数据。谢谢你的时间。
onCreate
函数使用创建文档时创建的数据触发。如果在文档创建时间和您的 Cloud Functions 运行时间之间有更新,它将不会包含在传递给您的代码的快照中。
如果您希望 Cloud Functions 中的 increment
是自文档创建以来可能发生的任何增量的补充,那么使用 increment
是正确的解决方案。
另一方面,如果您希望文档由 Cloud Function 初始化并且在此之前没有其他写入,您可能希望使用安全规则来拒绝那些早期写入,例如基于marker/flag Cloud Function 然后写入的字段。