MongoDB如何找到最近的邻居

时间:2017-04-05 20:45:51

标签: node.js mongodb rest

我正在尝试使用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的用户,但是如何在他之前显示一个用户,并在他之后使用点数。

谢谢

2 个答案:

答案 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);
});