【发布时间】: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