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 然后写入的字段。