【问题标题】:Swift 5 Firebase Query by child/keySwift 5 Firebase 按子/键查询
【发布时间】:2022-01-02 22:38:36
【问题描述】:

在我的数据库中,所有张贴的图片都有一个不断增加的相关联作为关键。

所以第一张图片有键“1”,第二张图片有键“2”,第1000张图片有键“1000”

现在我想查询它们按升序排列,包括分页。所以从最新的 10 开始,然后继续 11-20,依此类推。

如何在不使用子查询的情况下实现这一目标?目前我需要给它一个孩子(例如“id”然后是密钥)以便能够查询它。随着数据库的快速增长,这将导致不必要的保存数据。

例子

"root" {
  "images" {
         "1" {
           "id" : 1
             }
         "2" {
           "id" : 2
        }

等等

我想删除“id”部分,仍然可以查询它+分页

目前我只有在包含子部分时才能正确查询。

【问题讨论】:

    标签: swift firebase firebase-realtime-database swift5


    【解决方案1】:

    Firebase 实时数据库中的键始终是字符串。因此,即使您在其中输入数值,数据库也会将它们视为字符串。这在排序时尤其重要,因为字符串是按字典顺序排列的。

    在字典中,这是一些相关键的正确顺序:

    1
    10
    11
    19
    2
    20
    21
    29
    3
    30
    

    但您不太可能希望它们按此顺序排列,您希望键 10 (很好)在键 2 之后。

    要解决此问题,您应该以固定长度存储密钥:

    001
    010
    011
    019
    002
    020
    021
    029
    003
    030
    

    我在这里使用"0" 进行填充,但也可以使用空格。

    一旦你像这样填充了键,你可以得到一个键的片段:

    ref.queryOrderedByKey().queryStarting(atValue: "001").queryEnding(atValue: "010")
    

    请注意,在 Firebase 中使用连续数字键是一种反模式。我建议阅读 Best Practices: Arrays in Firebase 以了解更多信息。

    【讨论】:

    • 感谢您的回复!我看到的这个问题是我不知道会发布多少张图片。所以我想我必须保持以前的方式。可以是 10k、100k、1 百万。
    • 这是不使用顺序数字索引作为键的众多原因之一。但是,如果您选择保留这些,则必须选择最大数量的它们才能查询密钥,正如我在回答中所解释的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2018-06-05
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多