javascript - 在 Firebase 的有序列表中获取对象的索引

标签 javascript firebase

我正在使用 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/

相关文章:

javascript - Jquery - 如何在悬停时更改 img src?

html - 为什么 Facebook 共享无法获取我的 Firebase 存储镜像文件?

ios - 在标签中显示来自 firebase 身份验证的用户电子邮件

php - 无法将我的 Firebase 数据库与 PHP SDK 连接

android - 带汉字的 Firebase 远程配置

c# - 从 HtmlAgilityPack 调用 javascript 函数

javascript - 单击 div 时防止触发焦点事件

javascript - jQuery 样式类不起作用

javascript - Firebase 未经身份验证 - 引发错误 : permission_denied

重新打开应用程序时,Android Firebase Facebook 登录显示注销按钮