swift - 在 Firebase 中按指定子项过滤和排序

标签 swift firebase subquery

我正在使用 Firebase 和 Swift 构建一个游戏应用,并像这样存储我的数据。

players: {
   "category": {
       "playerId": {
         name: "Joe", 
         score: 3
       }
   }
}

我需要根据分数进行两个查询:

  • 从一个类别中选出前 5 名玩家。
  • 获取游戏总排名前 100 的玩家。

我在获取第一个查询的数据时没有问题,使用

 ref.child("players").child(category).queryOrdered(byChild: "score").queryLimited(toLast:5)

但是我无法理解第二个查询。我怎样才能有效地做到这一点?

最佳答案

您要么需要添加一个额外的数据结构以允许第二个查询(这在 NoSQL 数据库中很常见),要么更改您当前的结构以允许两个查询。

后者可以通过将数据转换为一个单一的平面列表来实现,并具有一些额外的合成属性。例如

players: {
   "playerId": {
     category: "category1"
     name: "Joe", 
     score: 3,
     category_score: "category1_3"
   }
}

使用新的附加属性 categorycategory_score,您可以通过以下方式获得某个类别的得分最高者:

ref.child("players")
   .queryOrdered(byChild: "category_score")
   .queryStarting(atValue:"category1_")
   .queryEnding(atValue("category1_~")
   .queryLimited(toLast:5)

总分前 100 名:

ref.child("players")
   .queryOrdered(byChild: "score")
   .queryLimited(toLast:100)

有关这方面的更多信息,请在此处查看我的回答:Firebase 数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值组合到一个(合成的)属性中。有关此方法和其他方法的示例,请在此处查看我的回答:http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase .

关于swift - 在 Firebase 中按指定子项过滤和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46479911/

相关文章:

swift - 如何指定相对于 ARImageAnchor 的子节点位置?

swift - 为什么我不能在 Swift Combine 中的 .tryMap() 之后使用 .flatMap()?

ios - 无法使用Swift 5(iOS)从Firebase数据库获取和打印单个值

android - 将文件上传到 Firebase 后如何获取文件 URL?

firebase - 在 Flutter 中使用 streamBuilder 时条件不起作用

select - MySQL 查询、子查询优化、SELECT、JOIN

ios - 如何将从相机拍摄的图像保存到 Parse?

android - 按给定条件更改 Firebase 数据库节点中的值

mysql获取要除以累积平均值的列中的值

mysql - 请问为什么 "ERROR 1235 (42000): This version of MySQL doesn' t还不支持 'LIMIT & IN/ALL/ANY/SOME subquery'”?