【问题标题】:firebase.firestore.FieldValue.serverTimestamp() as intfirebase.firestore.FieldValue.serverTimestamp() as int
【发布时间】:2021-09-08 11:47:16
【问题描述】:

如果我在我的 firestore 中使用以下命令:

firebase.firestore.FieldValue.serverTimestamp()

我正在保存serverTimestamp,但采用时间戳格式。如何使它与Date.now() 创建的数字格式相同?

我想要完成的是将serverTimestamp() 保存为纯整数格式,因此基本上以毫秒为单位保存firestore 的serverTimestamp - 非常重要。

编辑:

我正在使用 firestore 创建一个聊天应用程序,我的查询如下所示:

var loadnewmessages = messagesRef.orderBy("timestamp").where("timestamp", ">", parseInt(lasttimekey)).limit(50).onSnapshot((snapshot)  => {//listener for new messages
            var newmessages = lastchatbackup;
            //console.log("Loaded from backup: ", newmessages)
            var deletedmesssages = [];
            snapshot.docChanges().forEach((change) => {
                if(change.type  === "added"){...

lastchatbackup 在这种情况下是我的备份,我总是在收到新消息(整个聊天)后保存它,我还存储了lasttimekey,它是最新消息到达的时间戳(这是只有一个Date.now() 整数,没什么特别的)。

问题是,如果我有 2 台设备没有精确同时,我正在加载聊天备份加载不应该加载的消息不再(因为另一部手机有另一个 Date.now() 然后是我现在使用的手机。结果是,我得到了重复显示。

这就是我不能再使用 Date.now() 的原因,也是我想使用 firestore.FieldValue.serverTimestamp() 的原因。 但是现在我遇到的问题是,我在查询中过滤了所有比我备份中的最新消息更旧的消息,所以我只收到我手机上没有的消息尚未备份。

我只能在查询的 .where() 语句中使用字符串,那么当我不能再正确插入通常的(Date.now()).toString() 时,我应该如何按时间戳进行过滤?有没有办法实现基于时间戳过滤查询,所以基本上过滤掉旧消息?如果有,我应该以哪种格式将它们解析为查询调用中的.where() 语句?

【问题讨论】:

  • 那为什么不直接存储Date.now()呢?存储的服务器时间戳也可以在需要时转换为毫秒。
  • 答案如下,但听起来有点像XY problem - 所以我建议更新您的问题以解释实际用例。
  • @Dharmaraj Date.now() 是基于客户端的,不同的手机总会有偏移量,这就是我不能再使用Date.now() 的原因。
  • @FrankvanPuffelen 我更新了问题并实现了确切的用例以及我对这个问题的想法,也许现在我的问题更清楚了:)

标签: javascript reactjs firebase react-native


【解决方案1】:

您无法更改FieldValue.serverTimestamp() 保存其数据的方式,即Timestamp object。两者最大的区别在于 Firestore 的 Timestamp 对象具有纳秒级精度,而 JavaScript 的 Data.now() 仅具有毫秒级精度。

可以做什么,但是通过调用 toMillis() 从 Firestore Timestamp 对象获取只有几毫秒。

【讨论】:

  • 这听起来是个不错的方法,我现在遇到的问题只是我无法在我的 firestore 查询中使用.where(),因为(据我所知)我只能在里面插入字符串那里。有没有办法告诉查询只获取比 XX 更新的文档而不加载比 YY 更旧的文档?我也更新了我的帖子,也许有帮助!
  • wherevalue 部分可以是数据库中允许存在的任何类型。您也可以在那里传递Timestamp,这就是您可以进行时间戳比较的方式。
  • 再次感谢弗兰克的帮助!重构了我的代码和我的备份保存机制,查询与.Timestamp 对象一起工作!
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多