【问题标题】:sorting doesnt work with queryOrdered in firebase realtime database排序不适用于firebase实时数据库中的queryOrdered
【发布时间】:2020-02-06 07:19:34
【问题描述】:
  "users":{
    "steve_rodriquez":{
        "ch1":{
             "timestamp":2
        },
        "ch2":{
            "timestamp":1
        },
        "ch3":{
            "timestamp":4
        },
        "ch4":{
            "timestamp":3
        }
    }   
}

规则定义为

 "rules": {
    ".read": true,
    ".write": true,
    "users":{
         ".indexOn": ["timestamp"] 
    }
  }

当我尝试根据时间戳进行排序时,它不起作用。我添加了 1,2,3,4 只是为了举例

这是我的客户端代码

ref = Database.database().reference()
        (ref.child("users").child("steve_rodriquez")).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in
            print(snapshot.value as Any)
        })

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    当您从 Firebase 检索数据时,快照包含键、值、所有子节点的顺序。但是当您调用snapshot.value 时,它需要将其转换为Dictionary,它只有键和值的空间。所以此时关于子节点顺序的信息就丢失了。

    要保持子节点的顺序,请遍历snapshot.children,如listening for child events 上的文档所示,例如这个答案:Iterate over snapshot children in Firebase

    【讨论】:

    • 谢谢!这样可行。只是另一个问题,当我从规则中删除索引时,查询顺序仍然有效。我真的需要定义规则吗?
    • 如果您没有定义索引,排序/过滤将在客户端完成。因此,该位置的所有数据都将下载到客户端,然后在那里排序/过滤。如果您只是订购这只是有点慢。但是,如果您还进行过滤,那么您会以这种方式浪费带宽。
    • 谢谢!因此,假设我在规则中定义索引并按时间戳对其进行排序,并将结果限制为 10 并实现分页。是否仍将整个结果发送到客户端并订购,然后返回 10 个结果,还是仅将这 10 个结果提供给客户端(节省带宽)?
    • 如果没有索引,该位置的所有数据都会下载到客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多