programing

MongoDB 색인된 컬럼의 count(구분 x) 선택 - 대용량 데이터 세트에 대한 고유 결과 카운트

bestprogram 2023. 3. 8. 21:52

MongoDB 색인된 컬럼의 count(구분 x) 선택 - 대용량 데이터 세트에 대한 고유 결과 카운트

여러 기사 및 예를 살펴보았지만, MongoDB(수백만 줄의 문서가 있는 곳)에서 이 SQL 쿼리를 효율적으로 수행할 수 있는 방법을 아직 찾지 못했습니다.

첫 번째 시도

(예를 들어 거의 중복된 이 질문에서 Mongo는 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

세 번째 시도

, 몇 가지 .mapReduce

예.

또한.

에서 GitHub을 하는 풀 것 ..distinctmethod에서는 카운트만 반환되지만 아직 열려 있습니다.https://github.com/mongodb/mongo/pull/34

하지만 이 시점에서 저는 여기서 물어볼 가치가 있다고 생각했습니다. 이 주제에 대한 최신 정보는 무엇입니까?개별 카운트를 위해 SQL 또는 다른 NoSQL DB로 이동해야 합니까?아니면 효율적인 방법이 있을까요?

업데이트:

MongoDB 공식 문서에 대한 이 코멘트는 고무적이지 않습니다만, 정확한 것입니까?

http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808

업데이트 2:

새로운 Aggregation Framework는 위의 코멘트에 응답하는 것 같습니다.(MongoDB 2.1/2.2 이상, 실가동용이 아닌 개발 미리보기 이용 가능)

http://docs.mongodb.org/manual/applications/aggregation/

1) 이를 위한 가장 쉬운 방법은 집약 프레임워크를 사용하는 것입니다.여기에는 2개의 "$group" 명령어가 필요합니다.첫 번째 명령어는 개별 값을 기준으로 그룹화되며 두 번째 명령어는 모든 개별 값을 카운트합니다.

pipeline = [ 
    { $group: { _id: "$myIndexedNonUniqueField"}  },
    { $group: { _id: 1, count: { $sum: 1 } } }
];

//
// Run the aggregation command
//
R = db.runCommand( 
    {
    "aggregate": "myCollection" , 
    "pipeline": pipeline
    }
);
printjson(R);

2) Map/Reduce를 사용하여 이 작업을 수행할 수 있습니다.이 과정도 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() );

맵/축소 인라인 결과는 16MB 문서 크기 제한을 초과할 수 있으므로 반환할 수 없습니다.계산을 컬렉션에 저장한 후 컬렉션 크기를 카운트()하거나 mapReduce() 반환값에서 결과 수를 얻을 수 있습니다.

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;

다음과 같은 솔루션이 나에게 효과가 있었다

db.test.distinct('user'); ["alex", "England", "France", "Australia"]

db.db.db.db.db.db.길이 4

언급URL : https://stackoverflow.com/questions/11782566/mongodb-select-countdistinct-x-on-an-indexed-column-count-unique-results-for