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
예.
- 이건 몽고브에서 구별하고 그룹화하는 방법이야?(승인되지 않음, 응답 작성자/OP가 테스트하지 않음)
- 기능별로 이 1개의 MongoDB 그룹(Second Attempt와 유사)
- 이쪽 http://blog.emmettshear.com/post/2010/02/12/Counting-Uniques-With-MongoDB
- 이 https://groups.google.com/forum/?from groups #!topic/mongodb-user/trDn3jJqtE
- 이쪽 http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
또한.
에서 GitHub을 하는 풀 것 ..distinct
method에서는 카운트만 반환되지만 아직 열려 있습니다.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
'programing' 카테고리의 다른 글
처리에서 보류로 주문이 작성될 때 WooCommerce 주문 상태 설정 (0) | 2023.03.08 |
---|---|
요청된 bean이 현재 생성 중입니다.해결할 수 없는 순환 참조가 있습니까? (0) | 2023.03.08 |
2시간 이상 경과한 Firebase 데이터 삭제 (0) | 2023.03.08 |
스프링: 경로에 대한 /**와 /*의 차이 (0) | 2023.02.26 |
지시문의 scope.$watch가 AJAX 요청 후에 호출되지 않았습니다. (0) | 2023.02.26 |