2013-01-23 2 views
1

효율적인 몽고 쿼리를 찾으려고 노력한 흥미로운 사용 사례가 있습니다.mongodb에서 임의 쌍을 가져 오는 방법

시작하려면 10 만개의 게시물이있는 12,000 개의 카테고리가 있습니다. 무작위 카테고리에서 무작위로 100 쌍의 게시물을 선택해야합니다. 쌍은 범주에서 무작위로 선택되지만 각 쌍에는 두 범주의 게시물이 모두 같은 범주에 속해야합니다.

사용자는 각 쌍을 평가하여 100을 보았을 때 100 개의 무작위 게시물 (이미 본 적이있는 동일한 쌍이 아님)을 가져옵니다.

는 그래서 요구 사항은 다음과 같습니다

  • 무작위 카테고리의 임의의 집합 게시물 100 쌍을 가져 오기

옵션 요구 사항 :

  • 그들이 같은 쌍을 반환하지 않음 이미 평가 됨

몽고 컬렉션

  • 사용자
  • 카테고리
  • 게시물
    • 카테고리 ID
    • 등급 (게시물에 포함 된 컬렉션) 내가 몽고에서이 작업을 수행 할 방법

. ..이 데이터 중 일부를 몽고에서 옮겨야합니까? 더 쉽게 다른 db?

답변

0

예. 매우 흥미로운 질문입니다. 제 제안은 게시물 문서에 randomVal 필드를 넣는 것입니다. 그런 다음 {CategoryId: 1, randomVal: 1}에 정렬 할 수 있습니다. 결과는 CategoryId에 의해 모든 게시물을 그룹화하지만 그 그룹 내에서 임의로 커서를 움직이는 커서가됩니다. 개념적으로이를 배열로 생각한다면 짝수 번째 색인이 붙은 모든 게시물을 선택하고 홀수 이웃과 짝을 이루어 카테고리 내에서 고유 한 무작위 쌍을 얻을 수 있습니다.

이 목록에서 임의의 쌍을 선택하는 방법에 대해서는 약간의 실험이 필요하다고 생각하지만 내 직감은 최상의 접근 방법은 별도의 프로세스로 주기적으로 캐시를 분리하여 별도의 randomVal2. 사용자 대면 쿼리는 한 번에이 쌍 콜렉션 100을 통해 증가합니다.

0

두 가지 쿼리에서이 문제를 해결할 수 있다고 생각합니다. 먼저 집계 프레임 워크를 사용하고 게시물 모음에지도 축소 작업을 수행해야합니다. 맵 단계에서는 카테고리 ID를 키로 사용하고 포스트 ID를 감속기에 내 보냅니다.

감소 단계에서는 각 카테고리에서 2 개의 임의의 ID를 선택하십시오. 지도가 끝나면 Post 개의 ID 목록이 표시됩니다. 그런 다음 Posts 컬렉션에서 해당 소식을 검색합니다.

Post 문서에 ratedBy 필드를 추가하고 사용자가 자신의 userName을 ratedBy 필드에 추가 할 때 게시물을 평가했습니다. 그런 다음 해당 필드를 map reduce 명령에 대한 필터로 사용하여 우선 순위가 매겨진 문서를 사용자에게 가져 오지 않도록하십시오.

행운을 빌어 요.

+0

어떻게 임의로 수행합니까? 모든 게시물이나 카테고리를 스캔하고 싶지는 않으므로 임의의 세트를 가져 오는 방법이 있습니까? – MonkeyBonkey

+0

카테고리 및 게시물의 구조는 무엇입니까? 카테고리 또는 게시물을 어떻게 식별합니까? ID 유형은 무엇입니까? – cubbuk