问题 使用Firebase对多个值进行过滤和排序


我正在使用Firebase构建社交应用。我在Firebase中存储帖子,如下所示:

posts: {
   "postid": {
      author: "userid" 
      text: "",
      date: "timestamp"
      category: "categoryid"
      likes: 23
   }
}

每个帖子属于一个类别,可以喜欢帖子。

现在,我正在尝试显示属于特定类别的帖子,按喜欢的数量排序。我可能还希望按日期限制过滤器,以仅显示类别中最近,最喜欢的帖子。我怎样才能做到这一点?

Firebase查询功能似乎不支持这样的多个查询,这看起来很奇怪......


10428
2017-12-05 11:22


起源

看到 stackoverflow.com/questions/26700924/... - Kato


答案:


您只能使用一种订购功能 使用Firebase数据库查询但正确的数据结构将允许您通过多个字段进行查询

在您的情况下,您想按类别订购。它不是将类别作为属性,而是可以作为索引 posts

posts: {
   "categoryid": {
       "postid": {
         author: "userid" 
         text: "",
         date: "timestamp",
         category: "categoryid",
         likes: 23
       }
   }
}

现在,您可以编写查询以获取特定类别下的所有帖子。

let postsRef = Firebase(url: "<my-firebase-app>/posts")
let categoryId = "my-category"
let categoryRef = postsRef.childByAppendingPath(categoryId)
let query = categoryRef.queryOrderedByChild("date")
query.observeEventType(.ChildAdded) { (snap: FDataSnapshot!) {
  print(snap.value)
}

上面的代码为特定类别的帖子创建了引用,并按日期排序。数据结构可以进行多次查询。回调闭包为指定类别下的每个单独项目触发。

如果要进一步查询,则必须对数据进行客户端过滤。


11
2017-12-05 12:46



谢谢回复!这种方式可行,但我将保存对帖子的引用(仅存储帖子的ID)在其他位置(例如用户的提要等)。使用您建议的解决方案,仅使用帖子ID获取实际的帖子数据是不可能的,因为我还需要类别ID,以“向下钻取”到正确的节点...因为据我所知在查询数据库时,路径中不可能使用通配符(*),例如/ posts / * / [postid]? - andlin
一种解决方案当然是将帖子所属的类别存储在另一个节点中,例如/ category_for_post / [postid] / [categoryid],但这意味着我每次想要得到实际信息时都需要对此信息进行额外的查询一篇文章的数据。 - andlin
@andlin:是的,您还可以存储“标签”等类别并按这些标签进行搜索。你仍然可以按照上面的结构,但称之为 /categoryPosts 然后存储所有帖子 posts。复制数据是可以的,因为它会导致更快的读取,并且可以使它与客户端扇出保持一致。 firebase.com/blog/... - David East
@DavidEast有任何方式可以通过喜欢分页来订购。 - iDhaval
嗨,大家好。在Firebase上关注David East的结构。是否有任何方式可以通过分页喜欢订购?或者有没有办法让所有帖子分页? - HuyLe