在 Firestore 中管理 createdAt 时间戳

Seb*_*oFr 5 database firebase google-cloud-firestore

每天我都将来自外部零售商的产品导入Google Cloud Firestore数据库。

在该过程中,产品可以是新的(新文档将添加到数据库中),也可以是现有的(现有文档将在数据库中更新)。

应该注意的是,我每天导入大约 1000 万件产品,所以我不会查询每个产品的数据库来检查它是否已经存在。

我目前正在使用set 和 merge,这正是我需要的,因为如果它不存在或更新现有文档的特定字段,它会创建一个文档。

现在的问题是,如果提供的字段将被更新,我如何实现 createdAt 时间戳,因此原始 createdAt 时间戳将在更新时丢失?如果该字段已存在于文档中,有没有办法不更新特定字段?

Ren*_*nec 7

我建议您使用 Cloud Functions 函数,它会在创建 Firestore 文档时创建一个新的专用字段。set()当您更新文档时,此字段不应包含在您传递给方法的对象中。

以下是 Cloud Function 代码的提案:

const functions = require('firebase-functions');

const admin = require('firebase-admin');

admin.initializeApp();


exports.productsCreatedDate = functions.firestore
  .document('products/{productId}')
  .onCreate((snap, context) => {

    return snap.ref.set(
      {
        calculatedCreatedAt: admin.firestore.FieldValue.serverTimestamp()
      },
      { merge: true }
    )
    .catch(error => {
       console.log(error);
       return false;
    });
  });
Run Code Online (Sandbox Code Playgroud)

根据上面的 Bob Snyder 评论,请注意,您还可以执行以下操作:

const docCreatedTimestamp = snap.createTime;
return snap.ref.set(
  {
    calculatedCreatedAt: docCreatedTimestamp
  },
  { merge: true }
)
.catch(...)
Run Code Online (Sandbox Code Playgroud)