2017-04-05 1 views
0

mongo를 사용하여 간단한 리더 보드를 만들려고합니다. node.js로 API 빌드를 작성하고 표현합니다. MongoDB 가장 가까운 이웃을 찾는 방법

는 지금 I는 다음과 같습니다 사용자 점으로 분류 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 
    } 
] 

I는 다음과 같습니다 요청을 얻을 수 있습니다

User.find().sort({ points: '-1' }).exec(function(err, users) { 
    if (err) 
     res.send(err); 

    res.json(users); 
}); 

을 그리고 다른 하나는 지정된 ID를 찾을 수 요청을 얻을.

User.findOne({id: req.params.id}, function(err, user) { 
    if (err) 
     res.send(err); 
    res.json(user); 
}); 

나는 사용자의 ID를 보내고 그에 대한 정보를 얻습니다. 지정한 ID의 가장 가까운 이웃을 찾는 방법을 모르겠습니다. 예를 들어 나는 ID가 3 인 사용자를 발견하지만 그 전에 한 명의 사용자를 표시하고 그 뒤에 한 명의 사용자를 표시하는 방법을 사용합니다.

는이 테스트되지 않은 단지 아이디어를 당신

답변

-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); 
}); 
+0

어제 나를 구했고 그 일을 다시하고 있습니다. 고맙습니다. 이 솔루션이 예를 들어 10000 개 요소에서 작동하는지 알려주시겠습니까? 2 시간에 한 번 요청합니다. – omygoodness

+0

자, 그건 내가 모른다. MongoDB를 많이 사용할수록 제한적인 방법이 더 많이 발견되고 결국 이와 같은 이상한 솔루션을 수행해야합니다. – Mikey

+1

방금 ​​9276 사용자에게이 솔루션을 테스트 한 결과 정말 멋졌습니다 :) – omygoodness

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

이 점에 의해 제 1 하부 이상, 순서를 찾을 수 있습니다. 이웃 인이 값이 유효한 경우 $gte 또는 $lte을 사용할 수 있습니다.

관련 문제