我正在尝试使用mongo创建简单的排行榜。 我有node.js和express的API构建。
现在我按用户点排序json,如下所示:
[
{
"_id": "58e543758222ff220d0af481",
"id": 5,
"__v": 0,
"name": "Frank",
"points": 653
},
{
"_id": "58e543758222ff220d0af479",
"id": 1,
"__v": 0,
"name": "Bob",
"points": 321
},
{
"_id": "58e543758222ff220d0af47b",
"id": 2,
"__v": 0,
"name": "John",
"points": 123
},
{
"_id": "58e543758222ff220d0af47d",
"id": 3,
"__v": 0,
"name": "Bravo",
"points": 34
},
{
"_id": "58e543758222ff220d0af47f",
"id": 4,
"__v": 0,
"name": "Bill",
"points": 12
}
]
我收到的请求如下:
User.find().sort({ points: '-1' }).exec(function(err, users) {
if (err)
res.send(err);
res.json(users);
});
另一个get请求找到指定的id。
User.findOne({id: req.params.id}, function(err, user) {
if (err)
res.send(err);
res.json(user);
});
我只是发送用户的ID并获取有关他的信息。 我不知道如何找到指定id的最近邻居。例如,我找到id为3的用户,但是如何在他之前显示一个用户,并在他之后使用点数。
谢谢
答案 0 :(得分:0)
这不是经过测试,只是一个想法:
User.findOne({id: req.params.id}, function(err, user) {
if (err)
res.send(err);
User.findOne({ "points": { "$gt": user.points } }, { "$orderby": { "points": -1 } },
function(err, user_neigh_greater) {
if (err)
res.send(err);
res.json(user_neigh_greater);
});
User.findOne({ "points": { "$lt": user.points } }, { "$orderby": { "points": -1 } },
function(err, user_neigh_lower) {
if (err)
res.send(err);
res.json(user_neigh_lower);
});
});
按要点查找第一个更低或更高的顺序。如果具有等于 points 值的邻居有效,则可以使用$gte
或$lte
。
答案 1 :(得分:-1)
另一种方法是查询所有用户并使用结果集过滤掉它。
User.find().sort({ points: '-1' }).exec(function (err, users) {
if (err)
// probably good idea to add return to stop the code from going further
return res.send(err);
var nbd = [];
for (var i = 0; i < users.length; i++) {
// find the user with the given ID
if (users[i].id == req.params.id) {
// add user before him
if (i-1 >= 0) {
nbd.push(users[i-1]);
}
// add user
nbd.push(users[i]);
// add user after him
if (i+1 < users.length) {
nbd.push(users[i+1]);
}
// no need to search any further
break;
}
}
res.json(nbd);
});