Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB使用排序查询结果中的位置来计算字段_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js MongoDB使用排序查询结果中的位置来计算字段

Node.js MongoDB使用排序查询结果中的位置来计算字段,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我为用户提供了一个猫鼬模型。每个用户都有一定数量的积分。我想创建一个用户排名字段,其中: rank = user position sorted by rank / total users 假设用户模型如下所示: { 'name': 'bob', 'points': 15, 'rank': 9/15, } { "_id" : ObjectId("54f0af63cfb269d664de0b4e"), "name" : "bob", "point

我为用户提供了一个猫鼬模型。每个用户都有一定数量的积分。我想创建一个用户排名字段,其中:

rank = user position sorted by rank / total users
假设用户模型如下所示:

{
    'name': 'bob',
    'points': 15,
    'rank': 9/15,
}
{
    "_id" : ObjectId("54f0af63cfb269d664de0b4e"),
    "name" : "bob",
    "points" : 15,
    "rank" : 0.6666666666666666
}
{
    "_id" : ObjectId("54f0af7fcfb269d664de0b4f"),
    "name" : "arnold",
    "points" : 20,
    "rank" : 0.3333333333333333
}
{
    "_id" : ObjectId("54f0af95cfb269d664de0b50"),
    "name" : "claus",
    "points" : 10,
    "rank" : 1
}
(我意识到分数在存储时实际上是十进制的)

我是否可以通过以下方式更新所有这些用户:

1) 按点排序

2) 获取此排序列表中的用户索引

3) 将该索引除以列表中的项目总数


我不知道有什么样的mongo操作符可以在查询结果中查找文档的位置,以及查找查询结果的总大小。

您可以使用几个查询和一点JavaScript来实现这一点。扩展您概述的步骤,您需要做的是:

  • 找到所有用户文档,按
    点按降序对它们进行排序
    ,并将结果分配给光标。您可能希望确保此字段上有索引,以加快此查询的运行速度
  • 获取返回的文档数的计数
  • 使用索引跟踪文档在结果中的位置
  • 遍历文档,使用计数和索引计算
    ,并使用该计算结果更新相应用户的
  • mongo
    shell中,代码如下所示

    var c=db.user.find().sort({“points”:-1});
    var count=c.count();
    var i=1;
    while(c.hasNext()){
    var秩=i/计数;
    var user=c.next();
    db.user.update(
    {u id:user.\u id},
    {“$set”:{“rank”:rank}
    );
    i++;
    }
    
    因此,如果您的收藏中有以下三个用户:

    {
        "_id" : ObjectId("54f0af63cfb269d664de0b4e"),
        "name" : "bob",
        "points" : 15,
        "rank" : 0
    }
    {
        "_id" : ObjectId("54f0af7fcfb269d664de0b4f"),
        "name" : "arnold",
        "points" : 20,
        "rank" : 0
    }
    {
        "_id" : ObjectId("54f0af95cfb269d664de0b50"),
        "name" : "claus",
        "points" : 10,
        "rank" : 0
    }
    
    更新后,他们的文档将如下所示:

    {
        'name': 'bob',
        'points': 15,
        'rank': 9/15,
    }
    
    {
        "_id" : ObjectId("54f0af63cfb269d664de0b4e"),
        "name" : "bob",
        "points" : 15,
        "rank" : 0.6666666666666666
    }
    {
        "_id" : ObjectId("54f0af7fcfb269d664de0b4f"),
        "name" : "arnold",
        "points" : 20,
        "rank" : 0.3333333333333333
    }
    {
        "_id" : ObjectId("54f0af95cfb269d664de0b50"),
        "name" : "claus",
        "points" : 10,
        "rank" : 1
    }
    

    谢谢,这看起来很酷!update()是原子的吗?我想在一个mongo查询中完成这一切的主要原因是为了避免并发问题。MongoDB中的所有写操作都是文档级别的原子操作。唯一需要注意的是,您正在根据给定时间点的级别更新所有文档。当您完成更新时,排名可能已经改变,但这是您将遇到的问题。