IT

인덱싱 된 열의 MongoDB 선택 횟수 (고유 x)-대용량 데이터 세트에 대한 고유 한 결과 계산

lottoking 2020. 10. 10. 10:26

인덱싱 된 열의 MongoDB 선택 횟수 (고유 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에서 메소드 .distinct수정하여 개수 만 반환해야 할 것 같지만 여전히 열려 있습니다. https://github.com/mongodb/mongo/pull/34

그러나이 시점에서 나는 여기서 질문 할 가치가 있음을 생각했습니다. 주제에 대한 최신 정보는 무엇입니까? 고유 발행을 위해 SQL 또는 다른 NoSQL DB로 이동해야합니까? 아니면 어디에 있습니까?

최신 정보 :

MongoDB 공식 문서에 대한이 의견은 고무적이지 않습니다. 내가

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

업데이트 2 :

New Aggregation Framework가 위의 의견에 답하는 것 ... (MongoDB 2.1 / 2.2, 개발 미리보기 가능, 이상 용이 아님)

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


1)이를 수행하는 가장 쉬운 방법은 프레임 워크를 사용하는 것입니다. 두 개의 "$ 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)지도 / 축소 작업을 수행 할 수 있습니다. 이것은 단계 프로세스입니다. 첫 번째 단계에서는 키에 대한 모든 고유 값 목록이있는 새 컬렉션을 만듭니다. 두 번째에서는 새 컬렉션에 대해 카운트 ()를 수행합니다.

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 문서 크기 제한을 초과 할 가능성이 있으므로 맵 / 축소 인라인의 결과를 반환 할 수 없습니다. 당신은 수있는 컬렉션의 계산을 저장 한 다음 (계산) 컬렉션의 크기, 또는 맵리 듀스의 반환 값에서 결과의 수를 얻을 수있다 ().


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.countries.distinct ( 'country'). length 4

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