1. MongoDB의 집계함수
* count
: 컬렉션 내 문서의 갯수를 조회
: RDBMS의 count와 같은 기능
EX)
> db.person.count() // Collection의 Document 갯수 반환
> db.person.find({name:"neo"}).count() // 해당되는 Document들의 갯수 반환
* distinct
: 지정된 키에 대한 중복 제거(주어진 키의 고유한 값 찾기
: 컬렉션과 키를 지정해주어야 함.
: RDBMS의 distinct와 같은 기능
EX)
> db.runCommand({"distinct" : "Collection명","key":"Key명"}) // 해당 키에 대한 중복 제거
> db.phones.distinct('components.number',{'components.number':{$lt:50000}}) // 해당 조건에 맞는 것만 중복 제거
* group
: 지정된 키에 대한 그룹핑
: RDBMS의 group by 와 같은 기능
: 속도가 느리기 때문에 꼭 필요한 곳에만 사용하는 것이 좋음
: sort/limit 등을 사용하기 어려움
: 샤드 클러스터 환경에서 동작하지 않음
EX)
> db.person.group({key:{age:1},initial:{count:0},$reduce:"function(obj,prev){prev.count++;}" })
: reduce명령을 직접 지정하는 것이 가능
2. MongoDB 집계 프레임워크
: 2.1v 부터 지원
: 콜렉션 내의 문서들을 변환하고 결합 가능
: 내부적으로 MapReduce를 사용하지만, 사용이 더 쉬움
: 빠른 성능 보장
: group by, self join 등 SQL과 유사한 API를 제공
: 여과, 선출, 묶음, 정렬, 제한, 건너뛰기 등의 구성요소를 통해 파이프 라인을 만들 수 있음
: 결과는 콜렉션에 기록할 수 없기 때문에 클라이언트로 반환되어야 함
: 집계 결과는 최대 16MB데이터로 제한됨
: 복잡도 순위
group() < aggregation framework(집계 프레임워크) < map/reduce
: 주요개념
Piplines, Expressions
: Shard를 통해 BigData를 저장하고, Aggragation Framework를 통해 Bigdata를 처리한다.
* 주요개념
- PipeLine
: Unix의 Pipe와 동일하며 document를 stream화 시킨다.
: pipline operators는 document의 stream을 처리한다.
: map-reducing과 같은 원리
- Expressions
: input document를 수행한 계산 값을 기반으로 output document를 생성
: $addToSet, $first, $last, $max, $min, $avg, $push, $sum 등의 명령어 지원
* Pipelines의 주요 명령어
: $project : SELECT 절
: $match : WHERE 절
: $group : GROUP BY 절
: $sort : ORDER BY 절
: $limit, $skip, $unwind, $geoNear, $sum, $count...
* Aggregation과 SQL 맵핑 관계
: sql은 DBMS안에서 수행, MongoDB는 Sharding 기반에서 수행
* 집계 프레임워크 예제
> db.콜랙션명.aggregate({$project:{author:1}},
... {$group:{_id:'$author',count:{$sum:1}}},
... {$sort:{count:-1}},
... {$limit:5});
)
* 함수 만들기(그냥 함수 만들기 예제)
> populatePhones = function(area,start,stop){
... for ( var i = start ; i < stop ; i++ ){
... var country = 1 + ((Math.random() * 8)<<0);
... var num = ( country * 1e10 ) + (area * 1e7) + i;
... db.phones.insert({_id:num, components:{country:country, area:area, prefix:(i*1e4) << 0, number:i},display:'+'+country+' '+area+'-'+i});
... }
... }
3. MongoDB 리모트 명령
* 리모트 명령
: 로컬 MongoDB 콘솔에서 수정 명령어를 입력하면 원격 mongodb에서 데이터를 로컬로 불러와서 처리한뒤 다시 원격지에 저장한다.
: 비효율 발생
: eval 명령을 사용하면 원격지에서 바로 명령어를 실행한 뒤 결과를 받을 수 있음.
EX)
> db.eval(update_area); //
> db.eval("distinctDigits(db.phones.findOne({'components.number':5551213}))");
'프로그래밍 > NoSQL - MongoDB' 카테고리의 다른 글
MongoDB 로그 수집 및 분석하기 (0) | 2017.04.04 |
---|---|
MongoDB 운영방법 - 백업/복구 (0) | 2017.04.04 |
MapReduce (0) | 2017.04.04 |
mongoDB 리플리카 셋으로 장애 대응방법 배우기 (0) | 2017.04.04 |
MongoDB를 이용한 복제 방법 살펴보기 (0) | 2017.04.04 |