MongoDB-집계
집계 작업은 데이터 레코드를 처리하고 계산 된 결과를 반환합니다. 집계 작업은 여러 문서의 값을 함께 그룹화하고 그룹화 된 데이터에 대해 다양한 작업을 수행하여 단일 결과를 반환 할 수 있습니다. SQL count (*) 및 with group by는 MongoDB 집계와 동일합니다.
aggregate () 메서드
MongoDB의 집계에는 다음을 사용해야합니다. aggregate() 방법.
통사론
기본 구문 aggregate() 방법은 다음과 같습니다-
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
예
컬렉션에는 다음 데이터가 있습니다-
{
_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
},
이제 위 컬렉션에서 각 사용자가 작성한 자습서 수를 나타내는 목록을 표시하려면 다음을 사용합니다. aggregate() 방법-
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>
위의 사용 사례에 대한 SQL 해당 쿼리는 다음과 같습니다. select by_user, count(*) from mycol group by by_user.
위의 예에서는 필드별로 문서를 그룹화했습니다. by_user사용자에 의한 이전 합계 값이 발생할 때마다 증가합니다. 다음은 사용 가능한 집계 표현식 목록입니다.
표현 | 기술 | 예 |
---|---|---|
$ 합계 | 컬렉션의 모든 문서에서 정의 된 값을 합산합니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", num_tutorial : {$ sum : "$ likes"}}}]) |
$ avg | 컬렉션의 모든 문서에서 주어진 모든 값의 평균을 계산합니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", num_tutorial : {$ avg : "$ likes"}}}]) |
$ 분 | 컬렉션의 모든 문서에서 해당 값의 최소값을 가져옵니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", num_tutorial : {$ min : "$ likes"}}}]) |
$ 최대 | 컬렉션의 모든 문서에서 해당 값의 최대 값을 가져옵니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", num_tutorial : {$ max : "$ likes"}}}]) |
$ 푸시 | 결과 문서의 배열에 값을 삽입합니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", url : {$ push : "$ url"}}}]) |
$ addToSet | 결과 문서의 배열에 값을 삽입하지만 중복을 만들지는 않습니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", url : {$ addToSet : "$ url"}}}]) |
$ first | 그룹화에 따라 소스 문서에서 첫 번째 문서를 가져옵니다. 일반적으로 이것은 이전에 적용된 "$ sort"단계와 함께 만 의미가 있습니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", first_url : {$ first : "$ url"}}}]) |
$ last | 그룹화에 따라 소스 문서에서 마지막 문서를 가져옵니다. 일반적으로 이것은 이전에 적용된 "$ sort"단계와 함께 만 의미가 있습니다. | db.mycol.aggregate ([{$ group : {_id : "$ by_user", last_url : {$ last : "$ url"}}}]) |
파이프 라인 개념
UNIX 명령에서 쉘 파이프 라인은 일부 입력에서 작업을 실행하고 출력을 다음 명령의 입력으로 사용할 수있는 가능성을 의미합니다. MongoDB는 집계 프레임 워크에서도 동일한 개념을 지원합니다. 가능한 단계 세트가 있으며 각 단계는 문서 세트로 입력되어 결과 문서 세트 (또는 파이프 라인 끝에서 최종 결과 JSON 문서)를 생성합니다. 이것은 차례로 다음 단계 등에 사용될 수 있습니다.
다음은 집계 프레임 워크에서 가능한 단계입니다.
$project − 컬렉션에서 특정 필드를 선택하는 데 사용됩니다.
$match − 이것은 필터링 작업이므로 다음 단계에 입력으로 제공되는 문서의 양을 줄일 수 있습니다.
$group − 위에서 설명한대로 실제 집계를 수행합니다.
$sort − 문서를 정렬합니다.
$skip −이를 통해 주어진 문서 양에 대해 문서 목록에서 앞으로 건너 뛸 수 있습니다.
$limit − 이것은 현재 위치에서 시작하여 주어진 번호로 볼 문서의 양을 제한합니다.
$unwind− 배열을 사용하는 문서를 풀 때 사용합니다. 배열을 사용할 때 데이터는 일종의 사전 결합이며이 작업은 개별 문서를 다시 갖기 위해이 작업으로 취소됩니다. 따라서이 단계에서는 다음 단계를위한 문서의 양을 늘릴 것입니다.