Firestore 将具有服务器时间戳的对象附加到数组(字段类型)

Posted

技术标签:

【中文标题】Firestore 将具有服务器时间戳的对象附加到数组(字段类型)【英文标题】:Firestore append to array (field type) an object with server timestamp 【发布时间】:2021-05-26 14:22:43 【问题描述】:

我想按照下面提到的代码向 Firestore 文档插入一个对象。但它抛出了错误

   .update(
           "comments": firebase.fieldValue.arrayUnion(
            userId,
            comment: data.comment,
            createdAt: firebase.fieldValue.serverTimestamp(),
     )

错误

FirebaseError:使用无效数据调用函数 FieldValue.arrayUnion()。 FieldValue.serverTimestamp() 只能与 update() 和 set() 一起使用(在文档中找到...)

如何向推送的数组对象添加时间戳,或者有没有其他方法可以实现类似的结果?我从上面的错误中得到什么是我不能使用arrayUnion中的时间戳

【问题讨论】:

【参考方案1】:

您不能将FieldValue.serverTimestamp() 用作arrayUnion 的值,因为该函数不返回timestamp,而是在set()update() 中使用的标记。为此,您需要获取实际的timestamp class 值。获取此值的方式因本地 SDK 和管理 SDK 不同,因此根据您使用的内容,您可以执行以下操作:

对于 Admin SDK

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

const created_at = admin.firestore.Timestamp.now()

对于本地 SDK

import  Timestamp  from '@google-cloud/firestore';

const created_at = Timestamp.now()

然后您可以通过以下方式更新您的文档:

.update(
       "comments": firebase.fieldValue.arrayUnion(
        userId,
        comment: data.comment,
        createdAt: created_at,
 )

【讨论】:

它不起作用,我认为这个 serverTimestamp 只能从 set 或 update 方法内部调用 是的,我正在更新答案,请稍等。 已编辑,试一试。 :)

以上是关于Firestore 将具有服务器时间戳的对象附加到数组(字段类型)的主要内容,如果未能解决你的问题,请参考以下文章

swift语言中云Firestore服务器时间戳的等效数据类型是啥?

Swift & Firestore - 使用 .arrayUnion() 将字典附加到嵌套数组

swift firestore将用户附加到数组 - 完成块

将具有当前时间戳的列添加到 Hive 中的表

Firestore onSnapshot 通过 onEffect 中的状态附加到数组

Doctrine2:将具有子实体的对象映射到没有附加表的实体