[MONGODB] 인덱싱 된 열에 선택 MongoDB를 카운트 (고유 X) - 대용량 데이터 세트에 대한 고유 결과를 집계
MONGODB인덱싱 된 열에 선택 MongoDB를 카운트 (고유 X) - 대용량 데이터 세트에 대한 고유 결과를 집계
나는 몇몇 기사 및 예제를 통과하고 (행 문서의 수백만이있다) MongoDB를이 SQL 쿼리를 수행 할 수있는 효율적인 방법을 찾아야 아직있다
첫번째 시도
(예를 들어이 거의 중복 질문에서 - SQL의 SELECT DISTINCT의 몽고에 해당)
db.myCollection.distinct("myIndexedNonUniqueField").length
내 데이터 세트가 거대한이기 때문에 분명히 나는이 오류가 발생했습니다
Thu Aug 02 12:55:24 uncaught exception: distinct failed: {
"errmsg" : "exception: distinct too big, 16mb cap",
"code" : 10044,
"ok" : 0
}
두 번째 시도
나는 시도하고 그룹을하기로 결정
db.myCollection.group({key: {myIndexedNonUniqueField: 1},
initial: {count: 0},
reduce: function (obj, prev) { prev.count++;} } );
하지만 대신이 오류 메시지를 받았습니다 :
exception: group() can't handle more than 20000 unique keys
세 번째 시도
난 아직 시도하지 않은 있지만, 맵리 듀스를 포함하는 몇 가지 제안이있다
EG
또한
그것은 단지 수를 반환해야 언급 할 .distinct 방법을 고정 GitHub의에 끌어 오기 요청이 보인다,하지만 여전히 열려 : https://github.com/mongodb/mongo/pull/34
그러나이 시점에서 나는 주제에 대한 최신 무엇인가, 여기 물어 그것의 가치를 생각? 나는 별개의 개수에 대한 SQL 또는 다른 NoSQL의 DB로 이동해야 하는가? 또는 효율적인 방법은 무엇입니까?
최신 정보:
MongoDB의 공식 문서에이 주석 장려되지 않으며,이 정확합니까?
http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808
갱신 2 :
(하지 생산, 개발 미리보기가 없습니다, 위의 MongoDB를 2.1 / 2.2) 새로운 집계 프레임 워크는 위의 코멘트를 ... 대답 보인다
http://docs.mongodb.org/manual/applications/aggregation/
해결법
-
==============================
1.1)이 작업을 수행하는 가장 쉬운 방법은 통합 프레임 워크를 통해입니다. 고유 한 값에 의해 첫 번째 그룹, 두 번째 카운트 별개의 모든 값이 두 "$ 그룹"명령을한다
1)이 작업을 수행하는 가장 쉬운 방법은 통합 프레임 워크를 통해입니다. 고유 한 값에 의해 첫 번째 그룹, 두 번째 카운트 별개의 모든 값이 두 "$ 그룹"명령을한다
pipeline = [ { $group: { _id: "$myIndexedNonUniqueField"} }, { $group: { _id: 1, count: { $sum: 1 } } } ]; // // Run the aggregation command // R = db.runCommand( { "aggregate": "myCollection" , "pipeline": pipeline } ); printjson(R);
당신이지도와 함께이 작업을 수행하려면 2) / 당신이 할 수있는 줄이십시오. 이것은 또한 2 단계 프로세스입니다 : 첫 번째 단계에서 우리는 키마다 고유 한 값의 목록이 새 컬렉션을 구축 할 수 있습니다. 두 번째에서 우리는 새로운 컬렉션 수를 () 할.
var SOURCE = db.myCollection; var DEST = db.distinct DEST.drop(); map = function() { emit( this.myIndexedNonUniqueField , {count: 1}); } reduce = function(key, values) { var count = 0; values.forEach(function(v) { count += v['count']; // count each distinct value for lagniappe }); return {count: count}; }; // // run map/reduce // res = SOURCE.mapReduce( map, reduce, { out: 'distinct', verbose: true } ); print( "distinct count= " + res.counts.output ); print( "distinct count=", DEST.count() );
즉 잠재적으로 16 메가 바이트 문서 크기 제한을 오버런 때문에 참고는지도의 결과를 반환 할 수 없습니다 / 인라인 줄일 수 있습니다. 당신은 컬렉션의 계산을 저장 한 다음 (계산) 컬렉션의 크기, 또는 맵리 듀스의 반환 값에서 결과의 수를 얻을 수있다 ().
-
==============================
2.
db.myCollection.aggregate( {$group : {_id : "$myIndexedNonUniqueField"} }, {$group: {_id:1, count: {$sum : 1 }}});
결과에 스트레이트 :
db.myCollection.aggregate( {$group : {_id : "$myIndexedNonUniqueField"} }, {$group: {_id:1, count: {$sum : 1 }}}) .result[0].count;
-
==============================
3.다음과 같은 솔루션은 나를 위해 일
다음과 같은 솔루션은 나를 위해 일
from https://stackoverflow.com/questions/11782566/mongodb-select-countdistinct-x-on-an-indexed-column-count-unique-results-for by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽구스 - 포스 콜렉션 이름 (0) | 2019.12.09 |
---|---|
[MONGODB] 동일한 데이터베이스 내에서 컬렉션을 복사하는 가장 빠른 방법은 무엇입니까? (0) | 2019.12.09 |
[MONGODB] 어디 CAP 정리에 서 MongoDB를합니까? (0) | 2019.12.08 |
[MONGODB] MongoDB를 데이터베이스에서 삭제 모든 (0) | 2019.12.08 |
[MONGODB] 데이터베이스로 루씬 (또는 SOLR) 대되는 NoSQL (MongoDB를) (0) | 2019.12.08 |