MongoDB排序所有并获得特定范围

时间:2013-09-06 12:26:29

标签: mongodb

我正在使用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片大小。同样,排名不是元素分数,而是按分数排序的假设数组中的元素索引。

3 个答案:

答案 0 :(得分:2)

查看MongoDB游标操作sortlimitskip。当结合使用时,它们可用于获取与您的查询匹配的元素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})

一个查询的部分解决方案:

我尝试用一​​个查询执行此操作,但遗憾的是我无法完成它。我在下面提供详细信息,希望有人能够扩展这一点并完成我的工作。以下是我计划的步骤:

  1. 投影文档以将所有分数除以50并存储在新字段_score中。 (这是我得到的)
  2. 从_score中提取小数点前的值[被困在这里](目前,我没有找到任何办法做到这一点)
  3. 基于_score的组值。 (每组将给你一个插槽)
  4. 找到并返回您的分数所属的组(通过在汇总管道中使用$ match)

    db.sample.aggregate([{$ project:{_ id:1,user_name:1,得分:1,_score:{$ divide:[“$ score”,50]}}}])

  5. 我真的很想知道这是怎么做的!