2017-10-17 1 views
0

에 친구의 리더를 취득하는 방법이 내 친구 컬렉션MongoDB를

[ 
    { 
     "_id": "59e4fbcac23f38cdfa6963a8", 
     "friend_id": "59e48f0af8c277d7a8886ed7", 
     "user_id": "59e1d36ad17ad5ad3d0453f7", 
     "__v": 0, 
     "created_at": "2017-10-16T18:34:50.875Z" 
    }, 
    { 
     "_id": "59e5065f705a90cfa218c9e5", 
     "friend_id": "59e48f0af8c277d7a8886edd", 
     "user_id": "59e1d36ad17ad5ad3d0453f7", 
     "__v": 0, 
     "created_at": "2017-10-16T19:19:59.483Z" 
    } 
] 

이 내 점수 모음입니다 :

[ 
    { 
     "_id": "59e48f0af8c277d7a8886ed8", 
     "score": 19, 
     "user_id": "59e48f0af8c277d7a8886ed7", 
     "created_at": "2017-10-13T09:02:10.010Z" 
    }, 
    { 
     "_id": "59e48f0af8c277d7a8886ed9", 
     "score": 24, 
     "user_id": "59e48f0af8c277d7a8886ed7", 
     "created_at": "2017-10-11T00:56:10.010Z" 
    }, 
    { 
     "_id": "59e48f0af8c277d7a8886eda", 
     "score": 52, 
     "user_id": "59e48f0af8c277d7a8886ed7", 
     "created_at": "2017-10-24T09:16:10.010Z" 
    }, 
] 

이 내 사용자의 모음입니다.

[ 
    { 
     "_id": "59e48f0af8c277d7a8886ed7", 
     "name": "testuser_0", 
     "thumbnail": "path_0" 
    }, 
    { 
     "_id": "59e48f0af8c277d7a8886edd", 
     "name": "testuser_1", 
     "thumbnail": "path_1" 
    }, 
    { 
     "_id": "59e48f0af8c277d7a8886ee3", 
     "name": "testuser_2", 
     "thumbnail": "path_2" 
    }, 
    { 
     "_id": "59e48f0af8c277d7a8886ee9", 
     "name": "testuser_3", 
     "thumbnail": "path_3" 
    }, 
] 

그리고 마지막으로 내가 이런 일에 (지난 24 시간 동안 말) 특정 기간 동안 최고 점수 순으로 정렬 친구들의 목록이 필요 ... 이것을 달성하는 가장 좋은 방법은 무엇

[ 
{ 
"friend_id": "59e48f0af8c277d7a8886ed7", 
"friend_name":"test_user_2" 
"thumbnail":"image_path", 
"highscore":15 
}, 
"friend_id": "59e48f0af8c277d7a8886edd", 
"friend_name":"test_user_3" 
"thumbnail":"image_path", 
"highscore":10 
} 
] 

? 나는 집계 파이프 라인을 시도했지만 3 개의 콜렉션을 가지고 작업하는 것과 혼란 스럽다.

+0

컬렉션이 수행되는 방식은 SQL 테이블 디자인과 비슷합니다. 이유가 있니? 사용자는 동일한 문서에 모두 포함 된 친구 목록과 점수 목록을 가질 수 있습니다. 또한 MongoDB는 SQL과 같은 테이블을 조인하는 데 적합하지 않습니다. –

+0

@ A.P. 점수 항목은 시간이 지남에 따라 계속 증가 할 것입니다. 사용자는 하루에 20-30 점의 점수를 기록합니다. 친구의 경우 임베디드 될 수 있지만 100-500 항목의 배열 크기가 너무 커서 성능에 영향을주지는 않습니까? –

답변

0

답안을 따르면 문서의 배열 크기가 500 개이므로 각 항목에 "친구 ID"및 "생성 한"만 저장하므로 친구를 저장하는 것은 좋지 않을 수 있습니다. 컬렉션이 저장됩니다. 원하는 필드 만 선택하여 쿼리에 데이터를 투영하는 경우 성능 문제가 너무 많지는 않습니다. 점수에 대한

https://docs.mongodb.com/v3.2/tutorial/project-fields-from-query-results/#return-specified-fields-only

하루 (30)의 증가; 그것은 당신이하는 쿼리의 유형에 달려 있습니다. 문서 당 2MB 제한에 도달하려면 하루에 30 점이 추가됩니다.

How do I perform the SQL Join equivalent in MongoDB?

또는

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

당신이 경우 사용하여 MongoDB에서 통합 프레임 워크를 사용해야합니다

에 대한 다양한 컬렉션을 그것에 대해 스택 오버플로 문제가되는 합류 ; 찾기 명령 만이 아닙니다.

+0

조회 집계를 사용하여 작업하고 있습니다. 현재 사용자가 10,000 명의 사용자와 100,000 점의 항목을 따로 수집 한 경우 지난 24 시간 동안 친구의 리더 보드를 얻으려면 내 현재 쿼리 시간이 약 400ms입니다. 어떤 속도로 증가할지 모르겠다. 나는 배열 방식으로 비교를 시도해야한다고 생각한다. –

+0

다른 컬렉션 디자인을 벤치 마크하는 것은 항상 좋은 생각입니다. –