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}))");




+ Recent posts