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

时间:2017-05-21 10:42:37

标签: c# firebase firebase-realtime-database unity5

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

enter image description here

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

我想

  1. 检索前20条记录
  2. 按分数排序时,检索给定用户名(上2,本身和下2)周围的5条记录。
  3. 我设法通过以下查询检索前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

1 个答案:

答案 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将按分数对项目进行排序,然后返回锚项目密钥周围的项目。