Firebase 实时数据库:如何在按值排序后检索特定键周围的 10 条记录?

Firebase realtime database: how can I retrieve 10 records around a specific key after ordered by value?

我使用 Unity 在我的 Firebase 实时数据库中创建了一个简单的排行榜:

键对应用户名,值对应用户评分。

我要

  1. 检索前 20 条记录
  2. 检索给定用户名周围的5条记录(上2条,本身和下2条),按分数排序。

我设法通过以下查询检索前 100 个分数:

FirebaseDatabase.DefaultInstance.GetReference (LEADERBOARD_TABLE_CAPTION).Child (leaderboardName).OrderByValue ().LimitToLast (20)

我使用 LimitToLast,因为排序是按升序进行的。

结果如下:

1.test31,987
2.test85,975
3.test67,943
4.test94,941
5.test95,940
6.test71,929
7.test16,917
8.test64,911
9.test100,906
10.test42,870
11.test54,863
12.test88,861
13.test5,859
14.test97,844
15.test46,836
16.test26,765
17.test52,764
18.test4,763
19.test70,756
20.test51,742

然后对于第二个任务,我想检索用户名周围的分数,比方说 "test100"。我想检索这样的结果(注意test100不需要在前20):

 7.test16,917
 8.test64,911
 9.test100,906
 10.test42,870
 11.test54,863

我想要运行这样的查询,它从 test100 开始并限制为前 3 个,然后以 test100 结束并限制为最后 3 个,但是 按值排序 时尚。没有这样的功能(我找不到)。 StartAt 和 EndAt 始终基于 value ,但我无法根据分数 906 将查询居中(可能有很多用户的分数为 906)。

即使只有一个 906,我的解决方案仍然无效。当我居中并获得 906 左右的前 2 个和后 2 个分数时,我不知道居中值的排名,我无法显示当前用户的当前排名。最低效的解决方案是检索按值排序的所有分数并搜索当前用户,但当我有 10.000 条记录时,这不是解决方案。

我该怎么做?

此致,

弗西斯

Firebase 数据库查询可以检索项目开始于 一个特定的key/value 或项目结束于 一个特定的key/value ].要检索特定键之前的 5 个项目和特定键之后的五个项目,您将需要使用两个查询。

leaderboard = FirebaseDatabase.DefaultInstance.GetReference(LEADERBOARD_TABLE_CAPTION).Child(leaderboardName);
var anchorItemKey = "...";
Query itemsBefore = leaderboard.orderByKey().endAt(anchorItemKey).limitToLast(6);
Query itemsAfter = leaderboard.orderByKey().startAt(anchorItemKey).limitToFirst(6);

上面的每个查询将检索(最多)6 个项目,比您需要的多一个。这样做的原因是查询还将检索锚项本身。

Update:如果你想根据分数检索项目,围绕一个特定的键,你会使用带有两个参数的startAt()方法:

leaderboard = FirebaseDatabase.DefaultInstance.GetReference(LEADERBOARD_TABLE_CAPTION).Child(leaderboardName);
var anchorItemKey = "...";
var scoreOfAnchorItem = ...;
Query itemsBefore = leaderboard.orderByChild("score").endAt(scoreOfAnchorItem, anchorItemKey).limitToLast(6);
Query itemsAfter = leaderboard.orderByChild("score").startAt(scoreOfAnchorItem, anchorItemKey).limitToFirst(6);

使用此变体,Firebase 将按分数对项目进行排序,然后 return 锚项目键周围的项目。