복붙노트

[MONGODB] 주변의 플레이어와 몽고의 순위 리더

MONGODB

주변의 플레이어와 몽고의 순위 리더

어떻게 현재 플레이어의 계급과 주변의 플레이어 순위를 모두 얻을 수있는 쿼리를 만들 것입니다. 예를 들어, 나는 이름과 포인트 리더 수집을했다

{name: 'John', pts: 123}

요한은 23 위치에, 내가 22 일과 24 곳에서 사용자의 이름을 표시뿐만 아니라 할 것입니다.

나는 요한의 순위를 얻을 수 (123)보다 큰 점과 함께 리더 보드 항목의 수를 조회 할 수 있지만 내가 어떻게 효율적으로 단지 현재 플레이어 위와 아래 위를 기록하고 하나의 플레이어를받을 수 있나요? 혼자 인덱스 위치를 기반으로 항목을받을 수 있습니까?

나는 내가 먼저 수를 사용자의 순위 위치, 다음 스킵 제한 쿼리를 얻기 위해,이 쿼리를 만들 수 있다고 생각하지만 비효율적 인 것 같습니다 인덱스의 효율적인 사용을하지 않는 것

db.leaderboards.find({pts:{$gt:123}}).count();
-> 23

db.leaderboards.find().skip(21).limit(3)

마지막 쿼리는 내가 합리적 범위 쿼리 또는보다 효율적으로 뭔가 함께 할 수있는 방법이의 인덱스를 사용하여 24 개 기록을 통해 스캔 할 것 같다? 나는 사용자가 매우 낮은 000 번째 장소처럼, 위 경우이 문제가되고 볼 수 있습니다.

해결법

  1. ==============================

    1.세 가지 쿼리를 수행해야합니다 :

    세 가지 쿼리를 수행해야합니다 :

    var john = db.players.findOne({name: 'John'})
    var next_player = db.players.find(
        {_id: {$ne: john._id}, pts: {$gte: john.pts}}).sort({pts:1,name:1}).limit(-1)[0]
    var previous_player = db.players.find(
        {_id: {$ne: john._id}, pts: {$lte: john.pts}}).sort({pts:-1,name:-1}).limit(-1)[0]
    

    이름과 점에 인덱스를 만듭니다.

  2. from https://stackoverflow.com/questions/9992750/rank-leaderboard-in-mongo-with-surrounding-players by cc-by-sa and MIT license