【问题标题】:Filter and sort on multiple values with Firebase使用 Firebase 对多个值进行过滤和排序
【发布时间】:2015-12-05 11:22:11
【问题描述】:

我正在使用 Firebase 构建一个社交应用。我像这样在 Firebase 中存储帖子:

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

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

现在,我正在尝试显示属于特定类别的帖子,按喜欢的数量排序。可能我还想按日期限制过滤器,只显示一个类别中最近、最喜欢的帖子。我该怎么做?

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

【问题讨论】:

标签: firebase


【解决方案1】:

您只能使用一个排序函数with Firebase database queries但适当的数据结构将允许您按多个字段查询

在您的情况下,您想按类别订购。与其将类别作为属性,不如将其作为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)
}

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

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

【讨论】:

  • 感谢您的回复!这种方法可行,但我正在将帖子的引用(仅存储帖子的 ID)保存在其他位置(例如在用户的提要等中)。使用您建议的解决方案,仅使用帖子 ID 来获取实际的帖子数据是不可能的,因为我也需要类别 ID,以“向下钻取”到正确的节点......因为据我所知查询数据库时不能在路径中使用通配符(*),如/posts/*/[postid] ?
  • 一种解决方案当然是将帖子所属的类别存储在另一个节点中,例如 /category_for_post/[postid]/[categoryid] 但这意味着我将不得不为此做一个额外的查询每次我想获取帖子的实际数据时的信息。
  • @andlin:是的,您还可以存储“标签”等类别并按这些标签进行搜索。您仍然可以按照上面的结构,但将其命名为/categoryPosts,然后将所有帖子存储在posts 中。可以复制数据,因为它会导致更快的读取,并且您可以使其与客户端扇出保持一致。 firebase.com/blog/…
  • @DavidEast 有没有办法通过分页按喜欢排序。
  • 大家好。在 Firebase 上关注 David East 的结构。有没有办法通过分页按喜欢排序?或者有什么办法让所有的帖子都分页?
猜你喜欢
  • 2016-09-24
  • 2017-07-10
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2015-08-19
  • 2019-11-04
相关资源
最近更新 更多