我使用Unity在我的Firebase实时数据库中创建了一个简单的排行榜:
键对应于用户名,值对应于用户得分。
我想
我设法通过以下查询检索前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总是基于值,但我不能根据得分906来查询我的查询(可能有很多用户得分为906)。
即使只有一个906仍然我的解决方案不起作用。当我居中并在906左右获得前2和后2分时,我不知道居中值的排名,我无法显示当前用户的当前排名。最低效的解决方案是检索按值排序的所有分数并搜索当前用户,但当我有10,000条记录时,它不是解决方案。
我该怎么做?
致以最诚挚的问候,
fercis
答案 0 :(得分:2)
Firebase数据库查询可以检索从开始的特定键/值或以结尾的特定键/值的项目。要检索特定键之前的5个项目和特定键之后的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个项目,这比您需要的多一个。原因是查询还将检索锚项本身。
更新:如果您想要根据特定密钥的分数检索项目,您可以使用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将按分数对项目进行排序,然后返回锚项目密钥周围的项目。