在 Firebase 中按指定子项过滤和排序
Filtering and sorting by a specified child in Firebase
我正在使用 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"
}
}
使用新的附加属性 category
和 category_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 数据库查询只能 order/filter 在单个 属性 上。在许多情况下,可以将要过滤的值组合成一个(合成的)属性。有关此方法和其他方法的示例,请在此处查看我的回答:.
我正在使用 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"
}
}
使用新的附加属性 category
和 category_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 数据库查询只能 order/filter 在单个 属性 上。在许多情况下,可以将要过滤的值组合成一个(合成的)属性。有关此方法和其他方法的示例,请在此处查看我的回答:.