[英]Firebase query order
我有多个帖子,每个帖子都有自己的评论。 我想查询所有帖子,按其时间戳排序。 我试过了:
let query = Firebase(url: path)
let query.queryOrderedByChild("commentDate").observeEventType(.ChildAdded)
{ (queryResponse, cancelBlock) { ....
“ commentDate”是服务器上的整数。 在此查询中,我仅获得第一个对象
let query = Firebase(url: path)
query.queryOrderedByChild("commentDate").queryLimitedToFirst(100).observeEventType(.ChildAdded) { (queryResponse, cancelBlock) { ...
我也只有第一个对象...目前,我唯一的解决方案是查询all:
query.queryOrderedByChild("commentDate").observeEventType(.Value) { (queryResponse, cancelBlock) in ...
但是使用此方法,我必须先对数组进行排序,然后再显示给用户。
有什么想法可以使它们在服务器上排序吗?
编辑 Firebase数据的表示形式:
{
"-KGRZmSIDXz5hHkelthQ" : {
"something1" : "783151",
"something2" : "21",
"something3" : "wjeicisje ejej",
"comments" : "",
},
"-KGRa5skGzA1GAG09Lno" : {
"something1" : "783151",
"something2" : "21",
"something3" : "wjeicisje ejej",
"comments" : "",
},
"-KGVr-tti1zr1M1QLlHL" : {
"something1" : "783151",
"something2" : "21",
"something3" : "wjeicisje ejej",
"comments" : {
"-KGX1_rFSBLmQJ7QzCRc" : {
"commentBody" : "something",
"commentDate" : 1.461933727259896E9,
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
"-KGX1r5Lnhv9YbQre6as" : {
"commentBody" : "something",
"commentDate" : 1.461933797884702E9,
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
"-KGXVGKA0SYm-vRs6zsv" : {
"commentBody" : "something",
"commentDate" : 1.461941507496439E9,
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
},
}
}
您的数据结构看起来不错,因此一个简单的查询将返回您想要的结果
let commentsRef = ref.childByAppendingPath("-KGVr-tti1zr1M1QLlHL/comments")
commentsRef.queryOrderedByChild("commentDate").observeEventType(.ChildAdded, withBlock: {
snapshot in
let nodeData = snapshot.value
print(nodeData!)
})
上面的代码将以正确的顺序一次返回每个子节点。
如果节点数量很少,则可以一次读取它们并遍历快照。
usersRef.queryOrderedByChild("commentDate").observeEventType(.Value, withBlock: {
snapshot in
for child in snapshot.children {
print(child)
}
})
上面两个都将打印出按commentDate排序的每个注释节点
仅当您有兴趣检索每个帖子中的评论时,以上内容才有效。 如果不是,则需要更改Firebase结构并将注释移至单独的节点,如下所示
posts
post_01
post_02
etc
还有一个单独的注释节点,该节点引用该注释所属的帖子。 由于您要查询诸如post_02的评论,并希望它们按commentDate排序,因此请将帖子编号和日期合并为一个孩子。
comments
"-KGX1_rFSBLmQJ7QzCRc" : {
"for_post_and_commentDate": "post_02_1.461933727259896E9",
"commentBody" : "something",
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
"-KGX1r5Lnhv9YbQre6as" : {
"for_post_and_commentDate": "post_02_1.461933797884702E9",
"commentBody" : "something",
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
然后修改查询
usersRef.queryOrderedByChild("for_post_and_commentDate")
queryStartingAtValue("post_02_0").queryEndingAtValue("post_02_xxx").observeEventType(.Value, withBlock: {
您必须弄清楚commentDate格式,因为如果存储开始和结束时间戳记,它们会更容易:20160430100621作为yyyymmddhhmmss格式,那么可以像这样查询时间戳记:
starting: post_02_0
ending: post_02_99999999999999
这也使您可以灵活地查询昨天或上周发生的post_02的注释。
如果您知道整个路径,Firebase可以查询嵌套的子级(例如, dimensions/length
类的东西)。 它不能处理每个子对象下该路径中的动态元素(例如$commentid/commentDate
)。
进行此工作的唯一方法是将必要的数据提升到可以查询的水平。 例如,如果您跟踪每个博客帖子的lastCommentDate
:
{
"-KGRZmSIDXz5hHkelthQ" : {
"something1" : "783151",
"something2" : "21",
"something3" : "wjeicisje ejej",
"comments" : "",
},
"-KGRa5skGzA1GAG09Lno" : {
"something1" : "783151",
"something2" : "21",
"something3" : "wjeicisje ejej",
"comments" : "",
},
"-KGVr-tti1zr1M1QLlHL" : {
"something1" : "783151",
"something2" : "21",
"something3" : "wjeicisje ejej",
"firstCommentDate": 1.461933727259896E9,
"lastCommentDate": 1.461941507496439E9,
"comments" : {
"-KGX1_rFSBLmQJ7QzCRc" : {
"commentBody" : "something",
"commentDate" : 1.461933727259896E9,
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
"-KGX1r5Lnhv9YbQre6as" : {
"commentBody" : "something",
"commentDate" : 1.461933797884702E9,
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
"-KGXVGKA0SYm-vRs6zsv" : {
"commentBody" : "something",
"commentDate" : 1.461941507496439E9,
"commentOwnerImageView" : "something",
"commentOwnerName" : "something"
},
},
}
}
通过这种结构,您可以按博客的最新评论日期查询它们:
ref.orderByChild('lastCommentDate').limitToLast(10).on(...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.