aggregation(집계) 연산은 데이터 records를 처리하고 계산된 결과를 반환한다. aggregation 연산은 여러 document의 값을 그룹화하고 그룹화된 데이터에서 다양한 연산을 수행하고 하나의 결과를 반환한다. SQL count(*)와 group by를 사용하면 mongoDB aggregation과 동일하다.
집계를 위해서 aggregate() 메서드를 사용한다.
db.collection_name.aggregate(aggregate_option)
collection에서 다음의 데이터를 가진다고 하자.
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 10 }, { _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 },
이제 위의 collection으로부터, 만약 각 user로부터 얼마나 많은 tutorial이 쓰여졌는지 목록 상태를 출력하고 싶다면, aggregate() 메서드를 사용하면 된다.
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "result" : [ { "_id" : "tutorials point", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 }
위 경우와 동일한 Sql문은
select by_user, count(*)
from mycol
group by by_user
이다.
by_user로 묶은 뒤 by_user의 횟수를 센다.
위의 예에서 by_user 필드로 document를 그룹화하고 by_user가 발생할 때마다 이전 합계 값이 증가한다. 다음은 이용 가능한 집계 표현의 목록이다.
Expression | Description | Example |
---|---|---|
$sum | Sums up the defined value from all documents in the collection. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | Calculates the average of all given values from all documents in the collection. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | Gets the minimum of the corresponding values from all documents in the collection. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | Gets the maximum of the corresponding values from all documents in the collection. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | Inserts the value to an array in the resulting document. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | Inserts the value to an array in the resulting document but does not create duplicates. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | Gets the first document from the source documents according to the grouping. Typically this makes only sense together with some previously applied “$sort”-stage. | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | Gets the last document from the source documents according to the grouping. Typically this makes only sense together with some previously applied “$sort”-stage. | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
파이프라인 개념
UNIX 명령에서 쉘 파이프라인은 일부 입력에 대해 작업을 실행하고 다음 명령에 대한 입력으로 출력을 사용하는 등의 작업을 의미함
MongoDB 또한 집계 프레임워크에서 동일한 개념을 지원한다. 가능한 단계 집합이 있고 그들 각각은 document로 입력되어 document의 집합 결과를 생성한다. 또는 파이프라인의 끝에 최종 JSON document를 생성한다. 이건 다음 단계에 사용될 수 있다.
다음은 집계 프레임워크에서 가능한 단계들이다.
$project − Used to select some specific fields from a collection.
$match − This is a filtering operation and thus this can reduce the amount of documents that are given as input to the next stage.
$group − This does the actual aggregation as discussed above.
$sort − Sorts the documents.
$skip − With this, it is possible to skip forward in the list of documents for a given amount of documents.
$limit − This limits the amount of documents to look at, by the given number starting from the current positions.
$unwind − This is used to unwind document that are using arrays. When using an array, the data is kind of pre-joined and this operation will be undone with this to have individual documents again. Thus with this stage we will increase the amount of documents for the next stage.
'과목 > 빅데이터' 카테고리의 다른 글
Hadoop Mapreduce 개요 (0) | 2018.05.02 |
---|---|
빅 데이터 강의 (0) | 2018.05.01 |
MongoDB Indexing (0) | 2018.04.28 |
MongoDB sort (0) | 2018.04.28 |
MongoDB Limit (0) | 2018.04.28 |