在Firestore中管理createdAt时间戳

时间:2018-08-02 14:29:13

标签: database firebase google-cloud-firestore

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

在此过程中,产品可以是新产品(将新文件添加到数据库中)或现有产品(现有文件将在数据库中更新)。

应该指出的是,我每天要进口大约一千万种产品,因此我不会在数据库中查询每种产品是否已经存在。

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

现在的问题是,鉴于提供的字段将被更新,我如何才能实现createdAt时间戳,因此原始的createdAt时间戳将在更新时丢失?如果该字段已经存在于文档中,有什么方法可以不更新该字段?

1 个答案:

答案 0 :(得分:3)

我建议您使用Cloud Function,该函数会在创建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;
    });
  });

基于上面的Bob Snyder评论,请注意,您也可以这样做:

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