정의
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>, 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 } )
명령 필드
aggregate 명령은 다음 필드를 인수로 사용합니다.
필드 | 유형 | 설명 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 문자열 | 집계 파이프라인의 입력 역할을 하는 컬렉션 또는 뷰의 이름입니다. 컬렉션에 구애받지 않는 명령에는 | ||||||||||
| 배열 | 문서 스트림을 집계 파이프라인의 일부로 처리하고 변환하는 집계 파이프라인 단계의 배열입니다. | ||||||||||
| 부울 | 선택 사항. 파이프라인 처리에 대한 정보를 반환하도록 지정합니다. 다중 문서 트랜잭션에서는 사용할 수 없습니다. | ||||||||||
| 부울 | 선택 사항. 이 옵션을 사용하여 특정 쿼리에 대한
MongoDB 6.0부터 자세한 내용은 프로파일러 로그 메시지 및 진단 로그 메시지에는 메모리 제한으로 인해 집계 단계에서 임시 파일에 데이터를 쓴 경우 | ||||||||||
| 문서 | 커서 객체 생성을 제어하는 옵션이 포함된 문서를 지정합니다. 명령에
| ||||||||||
| non-negative integer | 선택 사항. 시간 제한을 밀리초 단위로 지정합니다. MongoDB는 | ||||||||||
| 부울 | |||||||||||
| 문서 | 선택 사항. 읽기 고려를 지정합니다.
가능한 읽기 고려 수준은 다음과 같습니다.
읽기 고려 수준에 대한 자세한 내용은 읽기 고려 수준을 참조하세요.
| ||||||||||
| 문서 | 선택 사항. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다: 데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. | ||||||||||
| 문자열 또는 문서 | 선택 사항. 집계에 사용할 인덱스입니다. 인덱스는 집계가 실행되는 초기 컬렉션/뷰에 있습니다. 인덱스 이름 또는 인덱스 사양 문서로 인덱스를 지정합니다.
| ||||||||||
| any | 선택 사항. 이 명령에 첨부할 사용자 제공 코멘트입니다. 설정되면 이 설명은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.
댓글은 유효한 모든 BSON types (문자열, 정수, 객체, 배열 등)이 될 수 있습니다.
| ||||||||||
| 문서 | |||||||||||
| 문서 | 선택 사항. 변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다. 문서 구문은 다음과 같습니다: 변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다. 명령에서 변수 값에 액세스하려면 변수를 사용하여 파이프라인 및 변수를 사용하는 전체 예시 버전 5.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명령에서는 다음 단계를 사용할 수 없습니다.aggregate명령에explain필드를 포함하지 마세요. 이를 포함하면 서버에서 APIStrictError 오류를 반환합니다.$collStats단계를 사용하는 경우count필드만 사용할 수 있습니다. 다른$collStats필드는 사용할 수 없습니다.
예시
aggregate 명령에 explain 옵션이 포함되어 있지 않은 경우 cursor 옵션과 함께 사용해야 합니다.
기본 배치 크기로 커서를 표시하려면
cursor: {}을 지정합니다.기본 배치 크기가 아닌 커서를 표시하려면
cursor: { batchSize: <num> }을 사용합니다.
대부분의 사용자는 명령을 직접 실행 대신 aggregate db.collection.aggregate() 에 mongosh 제공된 헬퍼 또는 운전자 에서 이에 상응하는 헬퍼를 사용해야 합니다.
명령 구문을 보여주는 처음 두 가지 예시를 제외하고 이 페이지의 예시에서는 db.collection.aggregate() 헬퍼를 사용합니다.
이 페이지의 예제에서는 sample_mflix 샘플 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.
다단계 파이프라인을 통한 데이터 애그리게이션
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' ], }
다음 예시 컬렉션 에 대해 aggregate 작업을 수행하여 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 작업(초기 배치 이후)에 대한 배치 크기를 지정하려면 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 노드에 기록된 것으로 확인된 데이터의 가장 최근 복사본을 읽도록 "majority" 의 읽기 고려 (read concern) 지정합니다.
중요
$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 } } )