我正在使用mongoDB。我有一个集合:
String user_name,
Integer score
我想创建一个获取user_name的查询。查询应按分数排序,该分数返回请求的user_name是其中之一的50个文档的范围。
例如,如果我有110个文件,其中user_name X1-X110分别为1-110,而输入的user_name为X72,我想获得范围:X51-X100
修改
3个文件的例子:
{ "user_name": "X1", "score": 1}
{ "user_name": "X2", "score": 2}
{ "user_name": "X3", "score": 3}
现在,如果我有上述110个文档,并且我想找到X72,我想获得以下文档:
{ "user_name": "X50", "score": 50}
{ "user_name": "X51", "score": 51}
...
{ "user_name": "X100", "score": 100}
我该怎么做?
澄清:我没有存储每个文档等级。我所拥有的是文档分数,它们不一定是连续的(这个例子有点误导)。这是一个误导性较小的例子:
{ "user_name": "X1", "score": 17}
{ "user_name": "X2", "score": 24}
{ "user_name": "X3", "score": 38}
当搜索“X72”时,我想根据其等级得到“X72”所在的50片大小。同样,排名不是元素分数,而是按分数排序的假设数组中的元素索引。
答案 0 :(得分:2)
查看MongoDB游标操作sort,limit和skip。当结合使用时,它们可用于获取与您的查询匹配的元素n到m:
cursor = db.collcetion.find({...}).sort({score:1}).limit(100).skip(50);
这应该按照分数的顺序返回51到100的文件。
答案 1 :(得分:0)
当我理解正确时,你想要查询在另一个玩家附近得分的用户。
通过三个查询,您可以选择用户,其上方的25个用户以及下面的25个用户。
首先,您需要获取用户及其分数。
user = db.collection.findOne({user_name: "X72"});
然后你选择接下来有25个以上得分的球员:
cursor db.collection.find(score: { $gt:user.score}).sort(score: -1 ).limit(25);
//... iterate cursor
然后你选择接下来25位得分低于他们的球员:
cursor db.collection.find(score: { $lt:user.score}).sort(score: 1 ).limit(25);
//... iterate cursor
答案 2 :(得分:0)
不幸的是,没有直接的方法来实现你想要的。您需要在客户端进行一些处理以确定范围。 首先通过简单的findOne / find
来获取分数db.sample.findOne({"user_name": "X72"})
接下来,使用得分值(本例中为72),计算客户端的范围
lower = 72/50 => lower = 1.44
提取小数点前的数字并将其设置为低位
lower = 1
upper = lower+1 => upper = 2
现在在您的客户端中将下限值和上限值乘以50,这样可以得到以下值。
lower = 50
upper = 100
传递较低和较高的值以查找并获得所需的列表。
db.sample.find({score:{$gt:50,$lte:100}}).sort({score:1})
一个查询的部分解决方案:
我尝试用一个查询执行此操作,但遗憾的是我无法完成它。我在下面提供详细信息,希望有人能够扩展这一点并完成我的工作。以下是我计划的步骤:
找到并返回您的分数所属的组(通过在汇总管道中使用$ match)
db.sample.aggregate([{$ project:{_ id:1,user_name:1,得分:1,_score:{$ divide:[“$ score”,50]}}}])
我真的很想知道这是怎么做的!