我正在使用 Firebase 构建排行榜。使用 Firebase 的优先级系统跟踪玩家在排行榜中的位置。
在我的程序执行的某个时刻,我需要知道给定用户在排行榜中的位置。我可能有成千上万的用户,因此遍历所有用户以找到具有相同 ID 的对象(从而为我提供索引)并不是真正的选择。
有没有更高效的方法来确定 Firebase 中有序列表中对象的索引?
编辑:我正在尝试弄清楚以下内容:
/
---- leaderboard
--------user4 {...}
--------user1 {...}
--------user3 {...} <- what is the index of user3, given a snapshot of user3?
--------...
最佳答案
如果您正在处理数十个或数百个元素并且不介意占用带宽,请参阅Kato
的回答。
如果您要处理数以千计的记录,则需要遵循 pperrin
的回答中原则上概述的方法。以下答案详细说明了这一点。
第 1 步:设置 Flashlight 以使用 ElasticSearch 为您的排行榜编制索引
Flashlight 是一个方便的节点脚本,可将 elasticsearch 与 Firebase 数据同步。
Read about how to set it up here.
第 2 步:修改 Flashlight 以允许您将查询选项传递给 ElasticSearch
在撰写本文时,Flashlight 无法让您告诉 ElasticSearch 您只对匹配文档的数量感兴趣,不文档本身。
I've submitted this pull request它使用简单的单行修复来添加此功能。如果在您阅读此答案时它没有关闭,只需手动更改手电筒的副本/分支即可。
第三步:执行查询!
这是我通过 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
是拥有相同或更多点数的用户数——换句话说,用户的排名!
关于javascript - 在 Firebase 的有序列表中获取对象的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23259046/