当前位置: 首页 > 知识库问答 >
问题:

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

宗政才俊
2023-03-14

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

键对应于用户名,值对应于用户分数。

我想

  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总是基于值,但是我不能基于分数906来居中我的查询(可能有很多用户都有分数906)。

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

我怎么能这么做?

顺致敬意,

费西斯

共有1个答案

裘嘉树
2023-03-14

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个项目,这比您需要的多了一个。原因是查询还将检索锚定项本身。

更新:如果您想检索基于分数的项目,围绕一个特定的键,您可以使用带有两个参数的start At()方法:

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将按分数订购物品,然后返回锚定物品钥匙周围的物品。

 类似资料:
  • 在身份验证成功时,我正在编写以下代码:

  • 波乔即是。java表示排行榜中的一个条目。Position是排行榜中的位置,1是得分最高的用户 . 我不知道该用什么谓词来返回5个条目,包括正在搜索的条目。另一个方面是性能,因为排行榜可以有几十万个条目。 *********编辑-1*********** 使用parallelStream()会导致问题吗? 列表条目=LeaderBoardUserEntryMap.EntrySet().Parall

  • 请帮助我想从Firebase实时数据库检索一个特定的数据,我有2个用户,教授和学生,我想使用该数据进行验证。 FireBase实时数据库 FireBase实时数据库

  • Position是排行榜中的位置,1是得分最高的用户 GameBoard类有两个方法: submitScore(String uid,int score)每个玩家调用这个方法将他的分数提交到游戏板上。每个玩家/用户只有一个条目,因此,如果玩家多次调用此方法,则存储其最新得分 GetLeaderBoard(字符串uid) 上述代码的问题: 何时(理想情况下,在submitScore()期间)以及如何

  • 当我试图检索recycleview中保存的数据时,它们显示的是所有用户的数据,而不是登录的用户。有人能帮忙吗?

  • firebase数据库最近的更新似乎有一些变化。我的项目在firebase\u数据库:^7.0.0版本下运行良好,但在firebase数据库的更新版本中,我无法更新项目代码。 以下是v7的工作版本 firebase\u数据库^9.0.12上的同一代码出现错误。我收到的错误在`(DataSnapShot snap)async{…}上错误是 无法将参数类型“Future Function(DataSn