我正在尝试使用MongoDB
和pymongo
构建排行榜类型的应用,并且设置一个非常简单的集合,我按整数值排序。这使得使用sort
和limit
来确定顶级和底层用户非常简单。
我的问题是,如果我想搜索位于集合中间的用户。如何创建一个能够确定用户所在的有序集合中的位置的查询?
使用此数据集,例如:
{user: 'A', value: 20}
{user: 'B', value: 10}
{user: 'C', value: 5}
{user: 'D', value: 4}
{user: 'E', value: 1}
如果我们正在寻找{user: 'C'}
,我将如何构建一个查询,它不仅返回用户文档,还返回用户在有序列表中的第3位?
接下来的问题是,如果我有这个问题,我如何确定用户B
和D
位于该用户周围的位置?
我已经知道如何将整个列表拉入我的应用程序并快速搜索它,但这似乎是解决此问题的错误/昂贵的答案。
答案 0 :(得分:1)
可能最让人想到的方法是运行2个查询。第一个查询是获取当前用户的值。然后使用该值从该查询中减去/添加一些常量值,以使用$gt
和$ lt``派生一系列具有接近值的用户。
棘手的是,范围内可能没有任何值,因此您可能需要考虑到这一点,如果发生这种情况,可能会运行其他查询。
但这实际上并没有给你排名这就是你所要求的。如果值(我假设这些是某种分数)相对有限,您可以存储一个或多个具有单独分数值的文档,您可以使用这些分数值来了解相邻范围。这是一个提出类似想法的blog post。
读取大型集合以获得该位置将是低效的,对于大n
可能是不可接受的。但取决于您的问题的范围/规模,这可能是可接受的和最简单的选择。