복붙노트

[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)이 작업을 수행하는 가장 쉬운 방법은 통합 프레임 워크를 통해입니다. 고유 한 값에 의해 첫 번째 그룹, 두 번째 카운트 별개의 모든 값이 두 "$ 그룹"명령을한다

    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. ==============================

    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. ==============================

    3.다음과 같은 솔루션은 나를 위해 일

    다음과 같은 솔루션은 나를 위해 일

  4. 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