2016-08-10 3 views
0

MongoDBpymongo을 사용하여 리더 보드 유형의 앱을 만들고 정수 값으로 정렬하는 방식으로 설정이 매우 간단합니다. 이렇게하면 sortlimit을 사용하여 상단 및 하단 사용자를 매우 사소하게 파악할 수 있습니다.정렬 된 몽고 컬렉션에서 문서의 위치 찾기

내 문제는 컬렉션 중간에있는 사용자를 검색하려고하는 경우입니다. 사용자가 정렬 된 컬렉션에서 어떤 위치에 있는지 확인할 수있는 쿼리를 어떻게 만들 수 있습니까?

예를 들어이 데이터 집합 사용 :

{user: 'A', value: 20} 
{user: 'B', value: 10} 
{user: 'C', value: 5} 
{user: 'D', value: 4} 
{user: 'E', value: 1} 

가 어떻게 우리가 {user: 'C'}을 찾고 주어진 쿼리를 만들 것입니다 그것을 반환뿐만 아니라 사용자의 문서뿐만 아니라, 사용자가 정렬 된 목록에 3이라고?

다음 질문은 내가 한 번 사용자가 BD이 해당 사용자 주변의 장소에 있다고 결정하는 방법입니까?

나는 이미 전체 목록을 내 응용 프로그램으로 가져 와서 빠른 검색을 수행하는 방법을 알고 있지만이 문제에 대한 잘못된/비싼 대답처럼 보입니다.

답변

1

아마도 두 가지 쿼리를 실행하는 것이 가장 좋은 방법 일 것입니다. 첫 번째 쿼리는 현재 사용자의 값을 가져 오는 것입니다. 그런 다음 해당 값을 사용하여 해당 쿼리에서 상수 값을 빼거나 더하여 $gt 및 $ lt``를 사용하여 가까운 값을 가진 사용자 범위를 유도합니다.

범위 내에 값이 없기 때문에이를 고려해야하고 추가 쿼리를 실행할 필요가있을 수 있습니다.

그러나 이것은 실제로 당신에게 당신이 요구하는 계급을주지는 않습니다. 값 (일종의 점수라고 가정)이 상대적으로 유한하다면 인접한 범위가 무엇인지 알기 위해 사용할 수있는 개별 점수 값이있는 하나 이상의 문서를 저장할 수 있습니다. 비슷한 아이디어를 제안하는 blog post입니다.

큰 컬렉션을 통해 위치를 얻기 위해 읽는 것이 비효율적 일 수 있으며 큰 의 경우 허용되지 않을 수 있습니다. 그러나 허용 가능한 가장 쉬운 옵션 일 수있는 문제의 범위/규모에 따라 다릅니다.

+0

여러 문서가 가능할 수 있습니다 ... 주기적으로 실행되는 일종의 정리 작업으로 순진한 접근 방식이 너무 비싸다는 것을 명심하십시오. – EEP