2016-04-29 159 views
0

我有多个帖子,每个帖子都有自己的评论。我想查询所有帖子,按他们的时间戳排序。我试过:Firebase查询订单

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) { ... 

我只得到了第一个对象,以及... 单一解决方案,我目前所面对的是查询所有:

query.queryOrderedByChild("commentDate").observeEventType(.Value) { (queryResponse, cancelBlock) in ... 

但使用我必须在向用户显示之前对数组进行排序。

任何想法我怎么能做到让他们在服务器上排序?

编辑 表示火力点的数据:

{ 
    "-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" 
     }, 
    }, 
    } 
} 
+0

会发生什么而不是孩子补充? –

+0

当我设置“价值”我得到所有的对象。但是当我设置“添加小孩”时,我只能得到一个对象。要在服务器上查询(orderbyChild),我必须设置observeEventType(.ChildAdded)。这里有更多的信息:https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-queries – Andrew

+0

据我所知,你可以做每个事件类型的查询,而不只是添加了孩子。正如[guide](https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-event-types)中所述,添加的孩子应该只返回1个对象。您是否尝试过其他订购查询? [queryOrderedByChild:,queryOrderedByKey:,queryOrderedByValue,或queryOrderedByPriority](https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-queries) –

回答

1

你的数据结构看起来不错,所以一个简单的查询将返回你想要

let commentsRef = ref.childByAppendingPath("-KGVr-tti1zr1M1QLlHL/comments") 

commentsRef.queryOrderedByChild("commentDate").observeEventType(.ChildAdded, withBlock: { 
    snapshot in 

    let nodeData = snapshot.value 
    print(nodeData!) 

}) 

以上将返回每个子节点的结果,按正确的顺序一次一个。

如果你有节点少量,你可以阅读他们在一个时间和迭代snapshot.children这样

usersRef.queryOrderedByChild("commentDate").observeEventType(.Value, withBlock: { 
    snapshot in 

    for child in snapshot.children { 
    print(child) 
    } 

}) 

上面两种情况,将打印出的每个命令注释节点评论日期

仅当您有兴趣检索每篇文章中的评论时,上述内容才有效。如果没有,你需要改变你的火力地堡结构和移动意见单独的节点,这样

posts 
    post_01 
    post_02 
    etc 

,这就是指的评论属于后一个单独的评论节点。由于您想要查询post_02的评论,并希望按评论日期排序,请将帖子编号和日期合并为一个孩子。

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评论昨天才发生的或 上个星期。

+0

您的代码将以正确的顺序显示单个帖子的评论。但是OP要求“我想查询所有帖子,按他们的时间戳排序”。由于帖子没有时间戳,因此这是不可能的。 –

+0

@FrankvanPuffelen我做了一个假设,因为评论节点有commentDate,这就是他们想要检索的。如果情况并非如此,那么我的答案将无法正常工作。我认为OP需要澄清。 – Jay

1

如果您知道整个路径(如dimensions/length),Firebase可以查询嵌套的子项。它无法处理每个子项下的路径中的动态元素(例如$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(... 
+0

你好弗兰克,能够像你上面说的那样排序吗?** commentDate(timelapse)**需要是独一无二的时区吗?我如何创建独特的时间戳?如果我使用示例** yyyyMMddHHmmss **格式,然后orderByChild它,我认为它可能会很复杂,它会给limitToLast(10)带来不正确的结果。 – tobeiosdev

+1

我会使用时间戳,而不是特定的日期格式。但不管如何:如果两个评论在相同的秒/ millesecond中发布,他们都会将'lastCommentDate'设置为相同的值。这将导致正确的行为。 –