繁体   English   中英

Firebase查询顺序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM