按时间戳分页Firebase查询

时间:2018-03-04 16:57:54

标签: swift firebase firebase-realtime-database

假设我要检索具有以下结构的帖子,分页,按时间戳排序:

post_key: {
    message: "message"
    timestamp: 1234567890
}

我可以使用.queryOrdered(byChild: "timestamp").queryLimited(toLast: 5)...进行初始提取。但是对于第二次获取,如果前一次获取的最后一个时间戳有重复,则会出现问题。

我必须以某种方式按timestamp订购并以钥匙结束。类似的东西:

.queryOrdered(byChild: "timestamp").queryEnding(atPOSTkey: lastPostKey)

任何想法如何解决这个问题?我想到的一种方法是将时间戳与post键连接起来,但我认为有一个更简单的解决方案(我看到有函数queryEnding(atValue, childKey)但似乎无法使其正常工作)。

修改1:

我认为我设法使其工作如下:ref.child("posts/byLocation/\(userLocation)/\(dashedInterests)").queryOrdered(byChild: "timestamp").queryEnding(atValue: lastTimestamp, childKey: lastPostKey).queryLimited(toLast: postsPerPage + 1).observeSingleEvent(of: .value) ...

问题是现在我总是收到这个警告:

  

使用未指定的索引。您的数据将被下载和过滤   在客户端上。考虑添加“.indexOn”:“timestamp”at   / posts / byLocation / 1 / 1-2-3更好的安全规则   性能

我无法真正添加.indexOn规则,因为我有几个动态生成的1-2-3节点(例如1,2,3,1-2,1-3等)

编辑2:

我添加了以下规则:

"posts": {
        "$dashed_interests": {
            ".indexOn": "timestamp"
        },
      "byLocation": {
        "1": {
          "$dashed_interests": {
            ".indexOn": "timestamp"
            } 
      }
}

我停止了警告。

如果有人能够证实我所做的事情是好的,那就太棒了!

感谢。

1 个答案:

答案 0 :(得分:0)

我设法使其工作如下:ref.child("posts/byLocation/\(userLocation)/\(dashedInterests)").queryOrdered(byChild: "timestamp").queryEnding(atValue: lastTimestamp, childKey: lastPostKey).queryLimited(toLast: postsPerPage + 1).observeSingleEvent(of: .value) ...其中lastPostKey和lastTimestamp是上次提取的最后一个键和时间戳。

还有一个问题,因为我总是收到这个警告:

  

使用未指定的索引。您的数据将被下载和过滤   在客户端上。考虑添加" .indexOn":" timestamp"在   / posts / byLocation / 1 / 1-2-3更好的安全规则   性能

由于我有几个节点,如1-2-3,它们是动态生成的(例如1,2,3,1-2,1-3等),我通过添加以下规则解决了这个问题:

"posts":{
        "byLocation":{
           "$location":{
              "$dashed_interests":{
                 ".indexOn":"timestamp"
              }
           }
        }
...