我有一个名为Posts的Firestore收藏
我在客户端插入了它,并且可以正常工作。

我想使用firebase函数将createdAt和updatedAt字段添加到我的帖子集合firestore中的每个插入中。

最佳答案

为了通过Cloud Function将createdAt时间戳添加到Post记录,请执行以下操作:

exports.postsCreatedDate = functions.firestore
  .document('Posts/{postId}')
  .onCreate((snap, context) => {
    return snap.ref.set(
      {
        createdAt: admin.firestore.FieldValue.serverTimestamp()
      },
      { merge: true }
    );
  });


为了将modifiedAt时间戳添加到现有的Post,您可以使用以下代码。但是,每当Post文档的某个字段发生更改(包括对createdAtupdatedAt字段的更改,以无限循环结尾)时,都会触发此Cloud Function。

exports.postsUpdatedDate = functions.firestore
  .document('Posts/{postId}')
  .onUpdate((change, context) => {
    return change.after.ref.set(
      {
        updatedAt: admin.firestore.FieldValue.serverTimestamp()
      },
      { merge: true }
    );
  });


因此,您需要比较文档的两种状态(即change.before.data()change.after.data())以检测更改是否涉及的字段不是createdAtupdatedAt

例如,假设您的Post文档仅包含一个字段name(不考虑两个时间戳字段),则可以执行以下操作:

exports.postsUpdatedDate = functions.firestore
  .document('Posts/{postId}')
  .onUpdate((change, context) => {
    const newValue = change.after.data();
    const previousValue = change.before.data();

    if (newValue.name !== previousValue.name) {
      return change.after.ref.set(
        {
          updatedAt: admin.firestore.FieldValue.serverTimestamp()
        },
        { merge: true }
      );
    } else {
      return false;
    }
  });


换句话说,恐怕您必须逐字段比较两个文档状态...。

10-07 19:46
查看更多