【问题标题】:Query Firebase for highest id, then add to it查询 Firebase 以获取最高 id,然后添加到它
【发布时间】:2017-05-06 12:34:09
【问题描述】:

我需要有关 Firebase 查询的帮助。我目前正在使用 AngularFire2。

我已经为此苦苦挣扎了好几天。阅读每份文件,观看每一个 YouTube 视频,问过很多人,但我一无所获..

我的 Firebase 结构是这样的:

ROOT
    jobs
        KYLigf4dFBvTTstR1Wy
            id: "1"
            customer: "Jeff F"
            description: "Repair a chair"
        KYLigACCViJVQffEoRl
            id: "2"
            customer: "Quick G"
            description: "Install a light bulb"
        KYLigSQasdCR3XfQ8WN
            id: "3"
            customer: "Justin S"
            description: "Do everything for everyone"
        KYLiddsfdsgWCKhjoiB
            id: "4"
            customer: "Heather D"
            description: "Have a baby"

所以我需要获取最高的 ID。然后我需要使用下一个 id 向列表中添加一个新条目。在这种情况下,它将是5。就是这样,这就是我所需要的。我正在努力做到这一点。

我已经尝试了一百万种不同的方法,但是当我尝试使用 push() 时,问题就来了,一切都崩溃了,所以我找不到正确的路径。

我想另一种说法是,我想从 Firebase 中提取最高 ID,然后将其保存到一个随它而变化的变量中。然后我可以在需要获取最新 id 时访问该变量 - 因为数字总是在变化。

【问题讨论】:

标签: angular firebase firebase-realtime-database angularfire2


【解决方案1】:

一种可能的解决方案是创建第二个节点来跟踪下一个 ID。

当您插入一个新作业时,在插入之后更新 nextJobId 节点以增加 ID。这将简化检索下一个 ID 的需要。

请注意,使用 Firebase 时,数据结构是非规范化的。可以创建额外的节点来加快读取速度。

ROOT
jobs
    KYLigf4dFBvTTstR1Wy
        id: "1"
        customer: "Jeff F"
        description: "Repair a chair"
    KYLigACCViJVQffEoRl
        id: "2"
        customer: "Quick G"
        description: "Install a light bulb"
    KYLigSQasdCR3XfQ8WN
        id: "3"
        customer: "Justin S"
        description: "Do everything for everyone"
    KYLiddsfdsgWCKhjoiB
        id: "4"
        customer: "Heather D"
        description: "Have a baby"
nextJobId: 5 // Create an index that provides the next Id.

【讨论】:

  • 起初我觉得这听起来有点荒谬,但我越想越意识到这就是 FireBase 的工作原理。我太习惯 SQL 了。这很完美!谢谢! :D
  • 来自 SQL 背景,我也在努力适应非规范化数据。这是 firebase 的合法用例。祝你好运!
【解决方案2】:

使用 Firebase 奇怪的“KYLigf4dFBvTTst...”键作为您的 id

我们都更习惯于使用 1、2、3 之类的传统 id,因此我们会竭尽全力寻找生成它们的方法。但是,创建常规 id 的需要给您带来了一个复杂的问题。

Firebase 看起来怪异的自动生成密钥实际上是为解决您的问题而设计的。它们具有递增 id 的功能,即它们告诉您创建的日期顺序,并且还像 UUID 一样有效地提供唯一性。

重要的是,它们允许多个离线客户端仍然生成很有可能按时间排序的唯一 ID。

Firebase 密钥可以离线生成

它们不仅看起来很奇怪,而且还可以神奇地在没有互联网连接的情况下生成

生成它们的过程,

.push

是一种纯客户端操作,可以在您未连接到网络时(例如)在您的浏览器中运行。它确实向数据库发送任何内容。

与此相关的是,firebase 密钥可以随意生成和丢弃而不会受到惩罚,并且您可以根据需要生成任意数量的密钥:只有当您实际将内容写入密钥时,数据库中才会真正发生任何事情.

放开1,2,3

他们来自前连接时代。 我正在考虑教我的小女儿在 Firebase Id 中计数...

【讨论】:

  • 感谢您的意见。我最近越来越多地尝试使用它。你是对的,这更容易。我仍然喜欢将 id 用于更用户友好的索引,但仍然......试图放手
猜你喜欢
  • 2022-06-29
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
相关资源
最近更新 更多