【问题标题】:Managing createdAt timestamp in Firestore在 Firestore 中管理 createdAt 时间戳
【发布时间】:2019-01-10 08:55:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 创建文档时如何使用云函数创建一个新的专用字段。当您更新文档时,该字段不应包含在您传递给set() 方法的对象中。
  • 好点。会试一试的。
  • 我已经根据我的评论详细说明了一个答案,并带有相应的 Cloud Function 代码。希望这会有所帮助。
  • 在 Node.js 端,DocumentSnapshot 包含createTime 的字段。
  • @BobSnyder 感谢 Bob 提供的信息,很高兴知道!您是否建议CF可以使用snap.createTime;作为字段值?

标签: database firebase google-cloud-firestore


【解决方案1】:

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

这里是云函数代码的提议:

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(...)

【讨论】:

  • 这看起来确实像我所追求的,我今晚会做一些测试,如果确认,我会接受答案。谢谢
  • 酷。我很想知道当您注入 1000 万个文档时它的行为。
  • 它似乎完成了这项工作。它表现得非常好,尤其是在使用批量写入时。最后,它归结为您可以将文档发送到它的速度。
  • 这个要非常小心,比如updatedAt会造成无限循环!
  • stackoverflow.com/a/60963531/271450 - 如果您正在寻找 updatedAt
【解决方案2】:

在 firebase 9 版本中,正确的方法是:

import { serverTimestamp } from "firebase/firestore";
....
return snap.ref.set(
      {
        calculatedCreatedAt: serverTimestamp();
.....

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 2019-10-14
    • 2016-12-18
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多