【问题标题】:Firebase queryStarting doesn't seem to workFirebase queryStarting 似乎不起作用
【发布时间】:2017-03-27 01:58:58
【问题描述】:

这是我的数据结构:

ft-public-records
   2015-01-01 00:00:00 GMT
        addedByUser: "user@gmail.com"
        rating: 1
        time: "2015-01-01 00:00:00 GMT"
        timestamp: 1490437551.593684

没有queryStartAt,我可以毫无问题地获取对象:

self.publicRef.child("2015-01-01 00:00:00 GMT").queryOrdered(byChild: "rating").observe(FIRDataEventType.value, with: { snapshot in
      print(snapshot)
})

结果:

Snap (2015-01-01 00:00:00 GMT) {
    addedByUser = "user@gmail.com";
    rating = 1;
    time = "2015-01-01 00:00:00 GMT";
    timestamp = "1490437551.593684";
}

但是,当我将 queryStarting 添加到 1 时,我得到了 null。

self.publicRef.child("2015-01-01 00:00:00 GMT").queryOrdered(byChild: "rating").queryStarting(atValue: 1).observe(FIRDataEventType.value, with: { snapshot in
                print(snapshot)
})

结果:

Snap (2015-01-01 00:00:00 GMT) <null>

请问我错过了什么?

【问题讨论】:

  • 添加了一个答案,让我知道它是否有效。谢谢。
  • 你能分享一个最小的、有代表性的真实 JSON 样本吗?现在只有一个节点,这使得很难看到查询应该如何工作。最好有真正的 JSON(作为文本,没有截图)。您可以通过单击your Firebase Database console 中的导出 JSON 链接轻松获取此信息。
  • 这些确实不是格式正确或使用不正确的查询。通常,查询将用于根据子节点的值读取未知节点。对于此问题中的查询,您已经知道密钥,因此不需要查询 - 可以使用 keyRef.observeSingleEvent(of: .value 检索该节点。也许我不明白您要做什么?它会使为所有评分等于 1 的孩子查询 ft-public-records 更有意义

标签: swift firebase firebase-realtime-database


【解决方案1】:

我最终通过将另一个子 houmie-2013-01-01 00:00:00 UTC 添加到 2013-01-01 00:00:00 UTC 来重组 json

{
  "ft-public-records" : {
    "2013-01-01 00:00:00 UTC" : {
      "houmie-2013-01-01 00:00:00 UTC" : {
        "rating" : 1,
        "time" : "2013-01-01 00:00:00 UTC",
        "timestamp" : 1.490550817827253E9,
        "username" : "houmie"
      }
    }
  },
}

这对我有用:

self.ref.child("ft-public-records").child("2013-01-01 00:00:00 GMT").queryOrdered(byChild: "rating").queryStarting(atValue: 1).observe(FIRDataEventType.value, with: { snapshot in
    print(snapshot)
})

【讨论】:

  • 这真是方向错了。您不想让节点变得那么深,因为它会阻止查询。正如我在评论中提到的,当您知道节点的密钥时,您不需要查询节点 - 您可以直接访问它!将节点埋得更深一层会让你陷入悲伤的世界。
  • 谢谢杰,但我需要知道某一天所有大于 1 的评分。如果我消除 "2013-01-01 00:00:00 UTC" 父级,我是否能够同时查询 rating 和 time?我的印象是 FireBase 不允许这样做。
  • 是的,你绝对可以做到。有多种方法可以在 stackoverflow 上构建该查询和一堆问答。请参阅我对This Question的回复
  • 我明白了。因此,您的解决方案是在其中添加一个复合键,例如time_rating = "2013-01-01 00:00:00 UTC_1"。这样做的缺点是,如果我需要查询一个新的组合,例如; “给我在那一天用户名 houmie 的所有记录”,我的数据中不会有那个复合键,因为我一开始就没有想到这一点。但是这里的这个解决方案可以让我过滤给定的日期,然后查询用户名 houmie。这有意义还是我错过了什么?谢谢
猜你喜欢
  • 2021-10-29
  • 2019-04-19
  • 2016-11-29
  • 2016-02-01
  • 2020-09-23
  • 2010-12-05
  • 2011-06-14
  • 2015-01-10
  • 2016-02-24
相关资源
最近更新 更多