2012-02-24 4 views
1

나는 약 500000 개의 데이터 세트가있는 콜렉션을 가지고 있으며, 임의의 데이터 세트를 찾고 싶습니다. find()를 customer-id로 제한하여 크기를 약 80000 세트로 줄일 수 있습니다. 인덱스도 고객 ID에 추가됩니다.MongoDB 임의의 데이터 세트 성능 찾기

$mongoCursor = $mongoCollection->find($arrQuery, $arrFields)->skip(rand(1, $dataCount)); 

프로파일 러가 지금 이야기 :

는 PHP에서 나는 임의의 데이터 집합을 얻기 위해 다음 명령을 사용

DB.Collection ntoskip:3224 nscanned:3326 nreturned:101 reslen:77979 262ms 

이 결과를 가져 오기 위해 꽤 많은 시간이 걸립니다. 데이터를 가져 오는 더 좋은 방법이 있습니까?

PHP에서 모든 ID를 가져온 다음 무작위로 하나의 ID를 가져 와서이 ID의 전체 집합을 찾습니다. 하지만 나는 PHP에서 많은 데이터를 가져 오는 것에 대해 걱정한다.

해당 주제에 대한 의견을 보내 주셔서 감사합니다. 단

+0

* 수 * 수 더 좋은 방법은 한 번에 충분한 수요가있다 ... (HTTPS A [모음에서 임의의 항목을 얻을 수있는 기능 요청]이 : // JIRA를. mongodb.org/browse/SERVER-533)를 MongoDB 티켓 추적기에 추가하십시오. 기본적으로 구현되는 경우 가장 효율적인 옵션 일 것입니다. (기능을 원한다면 투표를하십시오.) –

+0

이 질문은 스택 오버플로의 여러 형태로 여기에 있습니다. 가장 인기있는 질문은 [Random record from MongoDB] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb)입니다. 좋은 반응이 있습니다. 즉, 질문에 대한 가장 좋은 생각은 하나의 임의의 문서를 가져 오는 것이 아니라 결과 집합을 무작위로 추출하는 것입니다. 이를 위해 [Mongo에서 무작위로 결과 집합 주문하기] (http://stackoverflow.com/questions/8500266/ordering-a-result-set-randomly-in-mongo)를 참조하십시오. –

답변

0

안녕하세요 저는 임의의 문제에 대한 여러 가지 해결책을 시도했습니다. 커서를 사용하여 임의의 위치로 옮겼습니다. 그러나 이것은 매우 느립니다. 그런 다음 전체 데이터 세트를 사용하고 무작위 항목을 선택했는데 괜찮 았지만 더 좋을 수있었습니다.

db.collection.find({...}).skip(min).limit(max-min); 

그럼 난 그냥 결과 throught를 한 번 반복하고 난으로 시작하는 인덱스를 비교 :

나에게 가장 좋은 성능의 솔루션은 임의의 숫자를 선택 최소 및 최대 값을 가지고 사용하여 데이터베이스를 조회하는 것이 었습니다 = 분; 나는 ++; 임의의 집합에서 숫자와 일치하는 항목 만 가져옵니다. 나에게 무작위로 min과 max의 영역을 제한하는 것은 괜찮았다. 내 컬렉션 크기에 따라 min-max 창의 크기를 선택하기 위해 로그 방식을 사용했습니다.

결과는 임의의 결과 집합을 선택하는 정말 빠른 방법입니다.

희망이 있으면 누군가에게 도움이 될 수 있습니다.

--- 댄

2

Mongo가 찾고있는 문서에 도달 할 때까지 Mongo가 결과 집합을 따라 가도록 건너 뜁니다. 따라서 쿼리의 결과 집합이 클수록 더 오래 걸릴 것입니다.

이 사용 사례에 정말로 필요한 것은 무작위로 문서를 식별하는 것이 아니라 무작위로 문서를 식별하는 방법입니다. 각 문서에 증분 식별자를 부여한 다음 기존 ID가 발견 될 때까지 임의로 해당 ID 범위의 숫자를 선택하지만 많은 문서를 삭제하거나 가능한 일치 항목을 필터링하는 쿼리를 적용해야하는 경우 해당 범위 인구 밀도가 낮아 결과를 찾기까지 더 오래 걸릴 수 있습니다. 귀하의 데이터 및 사용 방법에 따라 다릅니다. http://cookbook.mongodb.org/patterns/random-attribute/

결론은 당신을 위해이 작업을 수행 할 것 몽고, 그래서 정말 것 :

이 방법은 데이터와 사용을 위해 작동하지 않을 경우

은 또한 방법은 여기에 설명을 시도 할 수 데이터에있는 문서를 무작위로 식별하는 방법을 생각해보십시오.