【发布时间】:2022-01-25 08:41:26
【问题描述】:
我有一个非常大的用户列表(数百万)存储在数据库中(在我们的例子中是 Mongo)。每个用户都有一个与之关联的分数。分数会根据用户的操作不断变化。
当列表按分数排序时,我希望能够查询每个用户的位置。
现在,我有一个分数索引。我查询所有用户,按分数对其进行排序,然后遍历以找到我想要的用户的位置。
var users = User.find({})
.sort({
score: -1
});
var position = 1;
for (
let user = await users.next(); user !== null; user = await users.next()
) {
if (user === targetUser) {
return position;
}
position++;
}
排序是一项缓慢的操作,但据我了解,索引已经对其进行排序,因此这仅与获取所有记录一样昂贵。
由于列表已排序,我也许可以通过执行二进制搜索来提高查找元素的速度。
更大的问题是将列表存储在内存中(我一直在 Node 中遇到堆内存不足的错误)。
什么是正确的数据库+数据结构来实现我想要的?
【问题讨论】:
-
如何给score添加索引,然后对score进行范围查询,按score排序,然后进行count。这应该通过分数给出用户的相对位置。请记住,具有相同分数的用户的位置对彼此来说有些随意。您尚未指定如何对具有相同分数的人进行排名。
-
能否详细说明范围查询?
-
范围查询是使用 $lt 或 $gt 运算符(小于或大于)的查询。
-
知道了。我用您建议的解决方案添加了答案。我认为它有助于解决内存问题,但仍然很慢。
标签: database mongodb sorting mongodb-query