【问题标题】:Multiple where queries to select date range and top 5 highest value for a variable多个 where 查询以选择日期范围和变量的前 5 个最高值
【发布时间】:2017-11-11 14:09:36
【问题描述】:

背景

我正在创建一个用户可以随时提交帖子的应用。该应用的主要功能之一是群组中的用户可以在一段时间内(例如过去 10 天的所有帖子)开始一个会话来投票选出最佳帖子。

然后,该应用会在表格视图中显示帖子。用户可以使用分段控件更改显示的帖子类型。一旦所有用户都投票了,那么下一个视图控制器将显示投票结果 - 仅显示每个类别的前 5 个帖子(“well”、“notWell”、“confused”)

这就是我在 Firebase 数据库中构建它的方式。

  • 每个用户都必须属于一个组 - 例如。 “平衡香蕉”。
  • 每个帖子必须属于三个类别之一 - 例如“好”、“不好”、“困惑”。
  • 每个帖子都必须有日期。

问题

我应该如何开发“显示每个类别的前 5 个帖子”的功能?

我需要为日期为 > x 的每个帖子类型检索 5 个投票数最高的帖子。

我查看了关于 SO 的几个问题,这些问题与使用 Firebase 数据库查询多个 where 子句有关,我认为最合适的方法是使用 QueryOrderedBy 过滤日期,然后编码逻辑以提取每个帖子中的前 5 个帖子类别。如果这是一种合适的方法,我应该如何遍历每个 snapshot.children 并为每个类别创建一个包含前 5 个帖子的字典?

与 Firebase 数据库中的多个 where 子句相关的 SO 帖子。

Query based on multiple where clauses in firebase 有一个由 Frank van Puffelen 提供的与此主题相关的出色回答。

当前代码

func loadData() {

    self.ref.child("session").child((self.currentUser?.team)!).queryOrdered(byChild: "date").queryStarting(atValue: postStartDate).observe(.value, with: {
        snapshot in

        var wellItems: [SessionPost] = []
        var notWellItems: [SessionPost] = []
        var confusedItems: [SessionPost] = []

        for item in snapshot.children {
            let postItem = SessionPost(snapshot: item as! DataSnapshot)
            if let postType = postItem.type {
                switch postType {
                case "well":
                    wellItems.append(postItem)
                case "notWell":
                    notWellItems.append(postItem)
                case "confused":
                    confusedItems.append(postItem)
                default:
                    break
                }
            }
        }

        self.topWellPostItems = wellItems
        self.topNotWellPostItems = notWellItems
        self.topConfusedPostItems = confusedItems
        self.tableView.reloadData()
    })

【问题讨论】:

    标签: swift firebase-realtime-database


    【解决方案1】:

    对于每个SessionPost 数组,您必须根据voteCount 进行排序。比如

    wellItems.sort(by: { $0.voteCount > $1.voteCount })
    topFiveItems = Array(wellItems.sort[0 ..< 5])
    

    【讨论】:

    • 谢谢@jože-ws。首先,SessionPost 是一个字典。我设法使用 wellItems.sorted(by: { $0.voteCount! > $1.voteCount!} ) 根据 voteCount 对项目进行排序。但是如何将 topWellPostItems 中的最大项目数限制为 3?
    • @Jason100。伟大的。如果这回答了问题,则将其标记为答案
    • 我仍然无法限制字典中的项目数。有什么建议吗?
    • 为此,您需要对数组进行切片并获取前五个项目。查看修改
    • 不幸的是它是一本字典。我应该如何对字典进行切片?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    相关资源
    最近更新 更多