如何在已排序的 MongoDB 集合中查找行的行号以计算其百分位数?

5 mongodb

我有一个大型 MongoDB 集合,其中包含一个 userID 和一个计数器,表示该用户随时间的总点击量。我希望能够计算给定的用户百分比。

从概念上讲,我想做的是对集合进行排序,然后获取该给定用户记录的行号,然后将该数字除以集合的总数:

percentile = row_index / total_rows;
Run Code Online (Sandbox Code Playgroud)

这将如何在 MongoDB 中完成?

Gat*_* VP 1

这里的简单解决方案是按总点击量降序排序。然后,您可以通过光标浏览结果,直到找到您的用户 ID。

显然,如果您必须经常运行该解决方案,则它不会提供出色的性能。获得“前 20 名”很容易,但获得“后 25%”的计算量要大得多。

如果此查询确实很重要或者您经常运行它,则有几种解决方法。

我认为最简单的方法就是运行一项定期为您构建百分位数的工作。基本上,您构建了一个如下所示的集合:

{ percent : 95, score : 888888 }
{ precent : 90, score : 777777 }
...
Run Code Online (Sandbox Code Playgroud)

要获得用户的百分位数,您只需在相对较小的集合中查找他们的分数即可。要更新这些分数,只需定期运行循环所有用户的作业即可。