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中的所有写操作都是文档级别的原子操作。唯一需要注意的是,您正在根据给定时间点的级别更新所有文档。当您完成更新时,排名可能已经改变,但这是您将遇到的问题。