我正在使用Firebase构建排行榜.使用Firebase的优先级系统跟踪玩家在排行榜中的位置.
在程序执行的某个时刻,我需要知道给定用户在排行榜中的位置.我可能有成千上万的用户,因此遍历所有用户以找到具有相同ID的对象(因此给我索引)实际上不是一个选项.
是否有更高效的方法来确定Firebase中有序列表中对象的索引?
编辑:我想弄清楚以下内容:
/ ---- leaderboard --------user4 {...} --------user1 {...} --------user3 {...} <- what is the index of user3, given a snapshot of user3? --------...
Dany Joumaa.. 6
如果您正在处理数十或数百个元素并且不介意带宽受到打击,请参阅Kato
答案.
如果您正在处理记录的原因,您需要遵循原则上在pperrin
答案中概述的方法.以下答案详细说明.
Flashlight是一个方便的节点脚本,可以将elasticsearch与Firebase数据同步.
了解如何在此处进行设置.
第2步:修改Flashlight以允许您将查询选项传递给ElasticSearch在撰写本文时,Flashlight无法告诉ElasticSearch您只对匹配的文档数量感兴趣,而不是文档本身.
我已提交此pull请求,该请求使用简单的单行修复来添加此功能.如果在您阅读此答案时没有关闭,只需手动更改手电筒的副本/分支.
第3步:执行查询!这是我通过Firebase发送的查询:
{ index: 'firebase', type: 'allTime', query: { "filtered": { "query": { "match_all": {} }, "filter": { "range": { "points": { "gte": minPoints } } } } }, options: { "search_type": "count" } };
替换points
为您的用户的字段跟踪点的名称,以及minPoints
您感兴趣的等级的用户的点数.
响应将类似于:
{ max_score: 0, total: 2 }
total
是具有相同或更多点数的用户数 - 换句话说,就是用户的排名!
如果您正在处理数十或数百个元素并且不介意带宽受到打击,请参阅Kato
答案.
如果您正在处理记录的原因,您需要遵循原则上在pperrin
答案中概述的方法.以下答案详细说明.
Flashlight是一个方便的节点脚本,可以将elasticsearch与Firebase数据同步.
了解如何在此处进行设置.
第2步:修改Flashlight以允许您将查询选项传递给ElasticSearch在撰写本文时,Flashlight无法告诉ElasticSearch您只对匹配的文档数量感兴趣,而不是文档本身.
我已提交此pull请求,该请求使用简单的单行修复来添加此功能.如果在您阅读此答案时没有关闭,只需手动更改手电筒的副本/分支.
第3步:执行查询!这是我通过Firebase发送的查询:
{ index: 'firebase', type: 'allTime', query: { "filtered": { "query": { "match_all": {} }, "filter": { "range": { "points": { "gte": minPoints } } } } }, options: { "search_type": "count" } };
替换points
为您的用户的字段跟踪点的名称,以及minPoints
您感兴趣的等级的用户的点数.
响应将类似于:
{ max_score: 0, total: 2 }
total
是具有相同或更多点数的用户数 - 换句话说,就是用户的排名!