database - 在 Firestore 中管理 createdAt 时间戳

标签 database firebase google-cloud-firestore

我每天都从外部零售商进口产品到一个Google Cloud Firestore数据库。

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

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

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

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

最佳答案

我建议您使用 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;
    });
  });

根据 Bob Snyder 上面的评论,请注意您还可以:

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

关于database - 在 Firestore 中管理 createdAt 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51656107/

相关文章:

java - 以编程方式检查java中服务器的可达性

typescript - 如何使用Typescript从firebase-admin导入FieldValue?

java - Firestore 添加 2 个文档执行时间

swift - Firestore 退出功能并且不将任何对象附加到数组

sqlite - Firestore集合(带有子集合)到Flutter中的Sqflite元素

MySQL : writing query for relational tables for strict categories

ruby-on-rails - 如何将 Postgres 数据库添加到现有的 Rails 项目

database - forEach 循环后的对象 SequelizeInstance

firebase - 我想将我的 firebase 信息与我的邮件相关联

javascript - 获取图像 url Firebase 存储(管理员)