정의
aggregate집계 파이프라인을 사용하여 집계 작업을 수행합니다. 파이프라인을 통해 일련의 단계를 거쳐 컬렉션 또는 기타 소스의 데이터를 처리할 수 있습니다.
팁
mongosh에서 이 명령은db.aggregate()및db.collection.aggregate()헬퍼 메서드 또는watch()헬퍼 메서드를 통해 실행할 수도 있습니다.헬퍼 메서드는
mongosh사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.
호환성
이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
- MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
중요
이 명령은 M0 및 Flex 클러스터에서 제한적으로 지원됩니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
버전 5.0에서 변경되었습니다.
명령은 다음과 같은 구문을 가집니다:
db.runCommand( { aggregate: "<collection>" || 1, pipeline: [ <stage>, <...> ], explain: <boolean>, allowDiskUse: <boolean>, allowPartialResults: <boolean>, cursor: <document>, maxTimeMS: <int>, bypassDocumentValidation: <boolean>, readConcern: <document>, collation: <document>, hint: <string or document>, comment: <any>, writeConcern: <document>, let: <document>, // Added in MongoDB 5.0 querySettings: <document> // Added in MongoDB 9.0 })명령 필드
aggregate 명령은 다음 필드를 인수로 사용합니다.
필드 | 유형 | 설명 |
|---|---|---|
| 문자열 | 집계 파이프라인의 입력 역할을 하는 컬렉션 또는 뷰의 이름입니다. 컬렉션에 구애받지 않는 명령에는 |
| 배열 | 문서 스트림을 집계 파이프라인의 일부로 처리하고 변환하는 집계 파이프라인 단계의 배열입니다. |
| 부울 | 선택 사항. 파이프라인 처리에 대한 정보를 반환하도록 지정합니다. 다중 문서 트랜잭션에서는 사용할 수 없습니다. |
| 부울 | 선택 사항. 이 옵션을 사용하여 특정 쿼리에 대한
MongoDB 6.0부터 자세한 내용은 프로파일러 로그 메시지 및 진단 로그 메시지에는 메모리 제한으로 인해 집계 단계에서 임시 파일에 데이터를 쓴 경우 |
| 부울 | 선택 사항입니다. 샤딩된 컬렉션에 대해 초기 샤드는 언제든지 사용할 수 없게 될 수 있으므로 부분 결과는 초기 파이프라인이 다음 중 하나인 경우 명령은
|
| 문서 | 커서 객체 생성을 제어하는 옵션이 포함된 문서를 지정합니다.
|
| non-negative integer | 선택 사항. 시간 제한을 밀리초 단위로 지정합니다. MongoDB는 |
| 부울 | |
| 문서 | 선택 사항. 읽기 고려를 지정합니다.
가능한 읽기 고려 수준은 다음과 같습니다.
읽기 고려 수준에 대한 자세한 내용은 읽기 고려 수준을 참조하세요.
|
| 문서 | 선택 사항. 선택 사항입니다. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다: 데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. |
| 문자열 또는 문서 | 선택 사항. 집계에 사용할 인덱스입니다. 인덱스는 집계가 실행되는 초기 컬렉션 또는 뷰에 있습니다. 인덱스 이름 또는 인덱스 사양 문서로 인덱스를 지정합니다.
|
| any | 선택 사항. 이 명령에 첨부할 사용자 제공 코멘트입니다. 설정되면 이 설명은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.
댓글은 유효한 모든 BSON types (문자열, 정수, 객체, 배열 등)이 될 수 있습니다.
|
| 문서 | |
| 문서 | 선택 사항. 변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다. 문서 구문은 다음과 같습니다: 변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다. 명령에서 변수 값에 액세스하려면 변수를 사용하여 파이프라인
버전 5.0의 신규 항목입니다. |
| 문서 | 선택 사항입니다. 이 명령 실행에만 적용되는 쿼리 설정입니다.
이러한 필드에 대한 설명은 명령 필드를 참조하세요. MongoDB는 이러한 설정을 클러스터에 저장하지 않습니다. 그리고 동일한 쿼리 형태를 가진 다른 쿼리에는 적용되지 않습니다. 쿼리 형태에 대한 지속되는 쿼리 설정을 지정하려면, MongoDB는 명령에 전달한 설정과 동일한 쿼리 형태에 대해 클러스터에 저장된 쿼리 설정을 결합합니다. 두 설정 모두 동일한 필드를 지정하는 경우 저장된 클러스터 설정이 우선합니다. 버전 9.0에 추가 되었습니다. |
aggregate 명령에 explain 옵션이 포함되어 있지 않은 경우 cursor 옵션과 함께 사용해야 합니다.
기본 배치 크기로 커서를 표시하려면
cursor: {}을 지정합니다.기본 배치 크기가 아닌 커서를 표시하려면
cursor: { batchSize: <num> }을 사용합니다.
집계 파이프라인에 대한 자세한 내용은 다음을 참조하세요.
세션
세션 내에서 생성된 커서의 경우 세션 외부에서 getMore을(를) 호출할 수 없습니다.
마찬가지로 세션 외부에서 만든 커서의 경우 세션 내부에서 getMore를 호출할 수 없습니다.
세션 유휴 시간 초과
MongoDB 드라이버와 mongosh는 승인되지 않은 쓰기 작업을 제외한 모든 작업을 서버 세션과 연결합니다. 세션과 명시적으로 연결되지 않은 작업(예: Mongo.startSession() 사용)의 경우, MongoDB 드라이버와 mongosh는 암시적 세션을 생성하고 이를 작업과 연결합니다.
세션이 30분 이상 유휴 상태인 경우, MongoDB 서버는 해당 세션을 만료된 것으로 표시하고 언제든지 세션을 종료할 수 있습니다. MongoDB 서버가 세션을 종료하면 진행 중인 모든 작업과 해당 세션과 관련된 열린 커서도 종료됩니다. 여기에는 noCursorTimeout() 또는 30분보다 큰 maxTimeMS()로 구성된 커서가 포함됩니다.
커서가 30 분 이상 유휴 상태일 수 있는 경우 Mongo.startSession()를 사용하여 명시적 세션 내에서 작업을 실행합니다. refreshSessions 명령을 사용하여 세션을 주기적으로 새로 고칩니다. 자세한 내용은 세션 유휴 시간 초과 를 참조하세요.
트랜잭션
aggregate는 분산 트랜잭션 내에서 사용할 수 있습니다.
그러나 다음 단계는 트랜잭션 내에서 허용되지 않습니다.
explain 옵션도 지정할 수 없습니다.
트랜잭션 외부에서 생성된 커서의 경우 트랜잭션 내부에서
getMore을(를) 호출할 수 없습니다.트랜잭션에서 생성된 커서의 경우 트랜잭션 외부에서
getMore를 호출할 수 없습니다.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
클라이언트 연결 해제
aggregate 또는 $out 단계를 포함하지 $merge 않는 작업의 경우:
aggregate를 발급한 클라이언트가 작업이 완료되기 전에 연결을 끊는 경우, MongoDB는 killOp를 사용하여 aggregate를 종료로 표시합니다.
쿼리 설정
버전 8.0에 추가 되었습니다.
쿼리 설정을 사용하여 인덱스 힌트를 설정하고, 작업 거부 필터 및 기타 필드를 설정할 수 있습니다. 해당 설정은 전체 클러스터의 쿼리 형태에 적용됩니다. 클러스터는 종료 후에도 설정을 유지합니다.
쿼리 옵티마이저는 쿼리 계획 중 추가 입력으로 쿼리 설정을 사용하여 쿼리를 실행할 계획에 영향을 미칩니다. 쿼리 설정을 사용하여 쿼리 형태를 차단할 수도 있습니다.
쿼리 설정을 추가하고 예시를 살펴보려면 setQuerySettings를 참조하세요.
find, distinct 및 aggregate 명령에 대한 쿼리 설정을 추가할 수 있습니다.
쿼리 설정은 더 많은 기능을 제공하며 더 이상 사용되지 않는 인덱스 필터보다 선호됩니다.
쿼리 설정을 제거 하려면 removeQuerySettings 를 사용합니다. 쿼리 설정을 가져오려면 집계 파이프라인 에서 $querySettings 단계를 사용합니다.
Stable API
Stable API V1를 사용할 때 aggregate 명령은 다음과 같은 예외 사항을 지원합니다.
다음 집계 단계는 Stable API V1에서 사용할 수 없습니다.
explain필드는 Stable API V1에서 사용할 수 없습니다. 이를 포함하면 서버에서 APIStrictError 오류가 반환됩니다.$collStats단계를 사용하는 경우count필드만 사용할 수 있습니다. 다른$collStats필드는 Stable API V1에서 사용할 수 없습니다.
예시
aggregate 명령에 explain 옵션이 포함되어 있지 않은 경우 cursor 옵션과 함께 사용해야 합니다.
기본 배치 크기로 커서를 표시하려면
cursor: {}을 지정합니다.기본 배치 크기가 아닌 커서를 표시하려면
cursor: { batchSize: <num> }을 사용합니다.
명령을 직접 aggregate 실행하는 대신 db.collection.aggregate() 에 제공된 헬퍼 mongosh 또는 드라이버의 동등한 헬퍼를 사용합니다.
명령 구문을 보여주는 첫 두 가지 예시를 제외하고 이 페이지의 예시에서는 db.collection.aggregate() 헬퍼를 사용합니다.
이 페이지의 예시는 sample_mflix 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB 배포서버에 로드하는 방법에 대한 자세한 내용은 샘플 데이터세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우, 이 페이지의 예시를 실행하려면 데이터베이스를 제거하고 다시 생성해야 할 수 있습니다.
다단계 파이프라인을 통한 데이터 애그리게이션
sample_mflix 데이터베이스 의 movies 컬렉션 에는 다음과 같은 문서가 포함되어 있습니다.
참고
movies 컬렉션 의 문서에는 여기에 표시되지 않은 추가 필드가 포함되어 있습니다.
{ title: 'The Shawshank Redemption', year: 1994, genres: [ 'Crime', 'Drama' ], runtime: 142, imdb: { rating: 9.3, votes: 1521105, id: 111161 }, directors: [ 'Frank Darabont' ], cast: [ 'Tim Robbins', 'Morgan Freeman', 'Bob Gunton', 'William Sadler' ],},{ title: 'The Godfather', year: 1972, genres: [ 'Crime', 'Drama' ], runtime: 175, imdb: { rating: 9.2, votes: 1038358, id: 68646 }, directors: [ 'Francis Ford Coppola' ], cast: [ 'Marlon Brando', 'Al Pacino', 'James Caan', 'Richard S. Castellano' ]},{ title: 'Pulp Fiction', year: 1994, genres: [ 'Crime', 'Drama' ], runtime: 154, imdb: { rating: 8.9, votes: 1179033, id: 110912 }, directors: [ 'Quentin Tarantino' ], cast: [ 'Tim Roth', 'Amanda Plummer', 'Laura Lovelace', 'John Travolta' ]},{ title: 'Forrest Gump', year: 1994, genres: [ 'Drama', 'Romance' ], runtime: 142, imdb: { rating: 8.8, votes: 1087227, id: 109830 }, directors: [ 'Robert Zemeckis' ], cast: [ 'Tom Hanks', 'Rebecca Williams', 'Sally Field', 'Michael Conner Humphreys' ],},{ title: 'Inception', year: 2010, genres: [ 'Action', 'Sci-Fi', 'Thriller' ], runtime: 148, imdb: { rating: 8.8, votes: 1294646, id: 1375666 }, directors: [ 'Christopher Nolan' ], cast: [ 'Leonardo DiCaprio', 'Joseph Gordon-Levitt', 'Ellen Page', 'Tom Hardy' ],}다음 예시에서는 movies 컬렉션을 집계하여 각 고유 장르의 개수를 계산합니다.
db.runCommand( { aggregate: "movies", pipeline: [ { $project: { genres: 1 } }, { $unwind: "$genres" }, { $group: { _id: "$genres", count: { $sum : 1 } } } ], cursor: { }} )mongosh에서 db.collection.aggregate() 헬퍼를 사용하여 동일한 집계를 실행합니다.
db.movies.aggregate( [ { $project: { genres: 1 } }, { $unwind: "$genres" }, { $group: { _id: "$genres", count: { $sum: 1 } } } ])관리 데이터베이스에서 $currentOp 사용
다음 예시는 관리 데이터베이스에서 두 단계 파이프라인을 실행합니다. 첫 번째 단계에서는 $currentOp 작업을 실행하고 두 번째 단계에서는 결과를 필터 작업합니다.
db.adminCommand( { aggregate : 1, pipeline : [ { $currentOp : { allUsers : true, idleConnections : true } }, { $match : { shard : "shard01" } } ], cursor : { } })참고
aggregate 명령은 컬렉션을 지정하지 않고 대신 {aggregate: 1} 형식을 취합니다. 초기 $currentOp 단계는 컬렉션에서 입력을 가져오지 않습니다. 이 단계는 나머지 파이프라인이 사용할 자체 데이터를 생성합니다.
db.aggregate() 헬퍼는 이처럼 컬렉션이 없는 집계를 지원합니다. 위의 집계를 이 예시처럼 실행합니다.
집계 작업에 대한 정보 반환
다음 예시는 explain 을 true 로 설정하여 집계에 대한 정보를 반환합니다.
db.comments.aggregate( [ { $match: { date: { $gte: ISODate("2015-01-01") } } }, { $group: { _id: "$movie_id", commentCount: { $sum: 1 } } }, { $sort: { commentCount: -1 } } ], { explain: true })참고
explain 출력은 릴리스 간에 변경될 수 있습니다.
다음과의 상호 작용 allowDiskUseByDefault
실행하는 데 100 메가바이트 이상의 메모리가 필요한 파이프라인 단계는 기본값 으로 임시 파일을 디스크에 쓰기 (write) . 이러한 임시 파일은 파이프라인 실행 기간 동안 지속되며 인스턴스 의 저장 공간에 영향을 줄 수 있습니다.
개별 find 및 aggregate 명령은 다음 방법 중 하나를 통해 allowDiskUseByDefault 매개변수를 재정의할 수 있습니다:
1}이 로 설정된 경우 을 사용하여 임시 파일을 디스크에 쓰는 것을 허용합니다.
{ allowDiskUse: true }allowDiskUseByDefaultfalse1}이 로 설정된 경우 을 사용하여 임시 파일을 디스크에 쓰는 것을 금지합니다.
{ allowDiskUse: false }allowDiskUseByDefaulttrue
프로파일러 로그 메시지 및 진단 로그 메시지에는 메모리 제한으로 인해 집계 단계에서 임시 파일에 데이터를 쓴 경우 usedDisk 표시기가 포함됩니다.
배치 크기 지정 데이터 집계
초기 배치 크기를 설정하려면 cursor 필드에 batchSize 를 포함합니다.
db.theaters.aggregate( [ { $match: { "location.address.state": "NY" } }, { $group: { _id: "$location.address.city", theaterCount: { $sum: 1 } } }, { $sort: { theaterCount: -1 } }, { $limit: 2 } ], { cursor: { batchSize: 0 } }){ cursor: { batchSize: 0 } } 문서는 초기 배치 크기의 크기를 지정하고 비어 있는 첫 배치를 나타냅니다. 이것은 중요한 서버 쪽 작업을 수행하지 않고 커서 또는 오류 메시지를 빠르게 반환합니다.
후속 getMore 작업에 대한 배치 크기를 지정하려면 mongosh에서 batchSize()를 사용하거나 getMore 명령에서 batchSize 필드를 사용합니다.
데이터 정렬 지정
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
다음 집계 작업은 sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 모든 프랑스 영화의 제목을 반환하고 fr 데이터 정렬을 지정합니다.
db.movies.aggregate( [ { $match: {"countries": "France", "languages": "French"} }, { $project: { "title": 1, "_id": 0 } } ], { collation: { locale: "fr", strength: 1 } })데이터 정렬 필드에 대한 설명은 데이터 정렬 문서를 참조하세요.
인덱스 힌트
sample_mflix 데이터베이스 의 movies 컬렉션 에는 다음과 유사한 문서가 포함되어 있습니다.
{ title: "The Shawshank Redemption", year: 1994, rated: "R", imdb: { rating: 9.3, votes: 1513145, id: 111161 }},{ title: "The Godfather", year: 1972, rated: "R", imdb: { rating: 9.2, votes: 1038358, id: 68646 }},{ title: "The Dark Knight", year: 2008, rated: "PG-13", imdb: { rating: 9, votes: 1495351, id: 468569 }},{ title: "Forrest Gump", year: 1994, rated: "PG-13", imdb: { rating: 8.8, votes: 1087227, id: 109830 }}movies 컬렉션 에 다음 인덱스가 있다고 가정합니다.
db.movies.createIndex( { "imdb.rating": 1, year: 1 } )db.movies.createIndex( { "imdb.rating": 1, rated: 1 } )다음 집계 작업에는 지정된 인덱스를 강제로 사용하는 hint 옵션이 포함되어 있습니다.
db.movies.aggregate( [ { $sort: { "imdb.rating": 1 } }, { $match: { rated: "R", "imdb.rating": { $gte: 9.0 } } }, { $sort: { year: -1 } } ], { hint: { "imdb.rating": 1, rated: 1 } })기본 읽기 고려 재정의
기본 읽기 고려 수준을 재정의하려면 readConcern 옵션을 사용하세요. getMore 명령은 원래 aggregate 명령에 지정된 readConcern 수준을 사용합니다.
데이터베이스 의 컬렉션 에 대한 다음 작업은 movies 대부분의 sample_mflix 노드에 기록된 것으로 확인된 데이터의 가장 최근 복사본을 읽도록 읽기 고려 (read concern) 의 "majority" 지정합니다.
중요
$out단계를 포함하는 집계에 대해 읽기 고려(read concern) 레벨"majority"(을)를 지정할 수 있습니다.읽기 고려 수준에 관계없이 노드의 최신 데이터는 시스템에 있는 데이터의 최신 버전을 반영하지 않을 수 있습니다.
db.movies.aggregate( [ { $match: { "imdb.rating": { $gte: 8.0 } } }, { $group: { _id: "$rated", avgRating: { $avg: "$imdb.rating" }, count: { $sum: 1 } } }, { $sort: { avgRating: -1 } } ], { readConcern: { level: "majority" } })단일 스레드가 자신의 쓰기를 읽을 수 있도록 하려면 복제본 세트의 프라이머리에 대해 "majority" 읽기 고려 및 "majority" 쓰기 고려를 사용합니다.
에서 변수 사용 let
명령의 다른 곳에서 액세스할 수 있는 변수를 정의하려면 let 옵션을 사용합니다.
sample_mflix 데이터베이스 의 movies 컬렉션 에는 다음과 같은 문서가 포함되어 있습니다.
{ title: "The Shawshank Redemption", year: 1994, rated: "R", imdb: { rating: 9.3, votes: 1513145, id: 111161 }, runtime: 142}다음 예시에서는 let 옵션을 사용하여 파이프라인의 변수를 정의합니다. 이 예시에서는 평점이 높고 실행 시간이 긴 영화를 찾습니다.
db.runCommand( { aggregate: "movies", pipeline: [ { $match: { $expr: { $and: [ { $gte: [ "$imdb.rating", "$$minRating" ] }, { $gte: [ "$runtime", "$$minRuntime" ] } ] } } }, { $project: { title: 1, year: 1, "imdb.rating": 1, runtime: 1 } }, { $sort: { "imdb.rating": -1 } }, { $limit: 3 } ], cursor: {}, let: { minRating: 8.5, minRuntime: 120 }} )