【问题标题】:Firebase - order items according to server timeFirebase - 根据服务器时间订购商品
【发布时间】:2014-08-06 12:53:12
【问题描述】:

我想根据服务器写入时间将用户 cmets 维护为有序列表。关于这个的几个问题:

  1. 我可以根据 ServerValue.TIMESTAMP 创建(设置/推送)位置吗?

  2. 我可以用规则验证 (1) 吗?

  3. 我可以有把握地假设没有两个帖子会在确切的“同一时刻”写出,相互覆盖吗?

  4. 如果我决定使用 setWithPriority,而不是按位置名称排序,我是否可以使用 ServerValue.TIMESTAMP 作为优先级(并通过规则验证......)

  5. “奖励”问题 - 是否仍然无法在 firebase 中创建 COUNT 查询?

=== 编辑 ===

我正在尝试实现类似聊天的功能。消息必须按时间顺序(通过服务器端时间戳)排序,以维护“讨论”的逻辑顺序(如果我使用客户端生成的顺序,那么本地机器时钟偏移可能会破坏整个讨论)。我可以使用规则来验证 ServerValue.TIMESTAMP 字段是否持久保存到任何新消息,但是,我似乎无法找到确保客户端实际使用 setWithPriority() 来持久保存数据的方法。我想不出任何办法来做到这一点 - 我错过了什么吗?

【问题讨论】:

  • #3 是一个很大的“不”。如果您的应用程序被广泛采用,则此声明将变得无法维护。相反,我会简单地使用push 来保证唯一性并将时间戳保持在一个值中和/或将其设置为优先级。
  • 所有这些都包含在saving dataretrieving data 下的文档中。这些是了解此类事情的好书。
  • @frank-van-puffelen - “推送”不依赖于客户端时间戳吗?如果是这样,我怎么能确保订单被保留?
  • push 只是保证一个唯一的ID。如果您使用服务器端时间戳来设置优先级,则可以使用它来维护顺序。但无法保证此类时间戳的唯一性:两个人的消息可能在完全相同的时刻到达服务器。
  • @FrankvanPuffelen - 谢谢,我明白你在说什么。不过,现在我有一个问题,我需要依靠客户来实际设置WithPriority。如果没有这个假设,我有什么办法可以得到按时间排序的消息列表?我可以以某种方式要求 FB 根据 ServerValue.TIMESTAMP 字段给我消息吗?

标签: firebase


【解决方案1】:
  1. 您可以使用.push() 生成自动 ID 作为密钥,也可以使用 .setWithPriority(),其中您的密钥可以是任何东西,优先级也可以是任何东西。据我所知,没有选择将serverValue.TIMESTAMP 作为密钥。唯一的方法是检索它并使用.child(retrievedTime).set(someData)显式将其设置为键

  2. 见 1)

  3. 不确定您的确切意思,因为没有将servervalue 设置为键的选项,但恕我直言,这是它的原因之一。

  4. 1234563但是,不能保证它是独一无二的。必须具有相同优先级的记录是完全合法的。
  5. 已承诺,但尚未提供。您可以在每次写入/删除时手动处理事务,请参阅docs

【讨论】:

  • 4 - ServerValue 可以使用 setWithPriority(data, Firebase.ServerValue.TIMESTAMP) 设置为优先级,我认为这是这里的问题。 5 - 或者在客户端抓取记录后使用 snapshot.numChildren();
  • @Kato re. snapshot.numChildren() - 拥有超过 2000 万个孩子的快照呢?你会用吗?
  • 当然不是。正确工作的正确工具。对于 2000 万儿童,我会维护一个柜台。即使是执行计数的服务器端查询也会变得缓慢而艰巨。
  • @Kato 准确地说 :) 第 5 点)交易是做柜台的正确工具。
  • 它们都是有效的工具。 2000 万儿童不是一个常见的用例,但肯定是一个有效的用例。
猜你喜欢
  • 2017-01-29
  • 2023-03-08
  • 2019-05-29
  • 2017-02-24
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2016-08-19
相关资源
最近更新 更多