2017-04-05 11 views
0

mongoを使って簡単なリーダーボードを作成しようとしています。 私はAPIをnode.jsでビルドしています。 MongoDB最近隣人を見つける方法

は、今のところ私はこのようになり、ユーザーのポイントによってソート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); 
}); 

を、別の指定されたIDを見つけるための要求を取得します。

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

私はユーザーのIDを送信し、彼についての情報を取得するだけです。 指定されたIDの最近隣を見つける方法がわかりません。たとえば、私はid:3のユーザーを見つけますが、彼の前に1人のユーザーを表示し、後に1人をポイントを使用して表示する方法もあります。

は、これはテストされていないだけでアイデアをあなた

答えて

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

あなたは私を昨日保存しました。あなたはもう一度やっています。ありがとうございました:) このソリューションは、例えば10000要素で動作するかどうか教えてください。私は2時間に1回そのような要求を送るでしょう。 – 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); 
    }); 
}); 

は、そのポイントによって、第一下部以上、オーダーを検索します。 の値がである隣接値が有効な場合は、$gteまたは$lteを使用できます。

関連する問題