假设我要检索具有以下结构的帖子,分页,按时间戳排序:
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"
}
}
}
我停止了警告。
如果有人能够证实我所做的事情是好的,那就太棒了!
感谢。
答案 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"
}
}
}
...