정의
$out집계 파이프라인에서 반환된 문서를 가져와서 지정된 컬렉션에 씁니다. 출력 데이터베이스를 지정할 수 있습니다.
$out단계는 파이프라인의 마지막 단계여야 합니다.$out연산자를 사용하면 집계 프레임워크에서 모든 크기의 결과 집합을 반환할 수 있습니다.경고
$out연산에서 지정한 컬렉션이 이미 존재하는 경우$out단계에서는 집계가 완료되면 기존 컬렉션을 새 결과 컬렉션으로 원자적으로 대체합니다. 자세한 내용은 기존 컬렉션 교체를 참조하세요.
구문
$out 단계에는 다음과 같은 구문이 있습니다.
$out출력 collection만 지정하는 문자열을 사용할 수 있습니다(즉, 동일한 데이터베이스의 collection으로 출력).{ $out: "<output-collection>" } // Output collection is in the same database $out출력 데이터베이스와 출력 컬렉션을 지정하기 위해 문서를 가져올 수 있습니다.{ $out: { db: "<output-db>", coll: "<output-collection>" } } MongoDB 7.0.3 및 7.1 부터
$out는 문서를 시계열 컬렉션에 출력할 수 있습니다.{ $out: { db: "<output-db>", coll: "<output-collection>", timeseries: { timeField: "<field-name>", metaField: "<field-name>", granularity: "seconds" || "minutes" || "hours" , } } } 중요
Time Series 세분성 변경
Time Series 컬렉션을 만든 후
collMod메서드를 사용하여 세분성을 수정할 수 있습니다. 그러나 각 버킷에 적용되는 기간을 늘릴 수만 있습니다. 줄일 수는 없습니다.필드설명dbcoll출력 collection 이름입니다.
timeseriesTime Series 컬렉션에 쓸 때 사용할 구성을 지정하는 문서입니다.
timeField는 필수 항목입니다. 다른 모든 필드는 선택 사항입니다.timeFieldtime series 컬렉션에 쓸 때 필요합니다. 각 time series 문서에서 날짜를 포함하는 필드의 이름입니다. time series 컬렉션의 문서에는
timeField값으로 유효한 BSON 날짜가 있어야 합니다.metaField선택 사항. 각 time series 문서에 메타데이터가 포함된 필드의 이름입니다. 지정된 필드의 메타데이터는 고유한 문서 시리즈에 레이블을 지정하는 데 사용되는 데이터여야 합니다. 메타데이터는 거의 변경되지 않아야 합니다. 지정된 필드의 이름은
_id이(가) 아니거나timeseries.timeField이름과 같지 않을 수 있습니다. 필드는 모든 데이터 유형이 가능합니다.metaField필드는 선택 사항이지만 메타데이터를 사용하면 쿼리 최적화를 개선할 수 있습니다. 예를 들어 MongoDB는 새 컬렉션에 대해metaField및timeField필드에 복합 인덱스를 자동으로 생성합니다 . 이 필드에 값을 제공하지 않으면 데이터는 시간을 기준으로만 버킷됩니다.granularity선택 사항입니다.
bucketRoundingSeconds및bucketMaxSpanSeconds을 설정한 경우에는 사용하지 마십시오.가능한 값은
seconds(기본값),minutes및hours입니다.연속적으로 들어오는 타임스탬프 사이의 시간과 가장 근접하게 일치하는 값으로
granularity를 설정합니다. 이렇게 하면 MongoDB가 컬렉션에 데이터를 저장하는 방법을 최적화하여 성능이 향상됩니다.세분 수준 및 버킷 간격에 대한 자세한 내용은 Time Series 데이터의 세부 수준 설정을 참조하세요.
bucketMaxSpanSeconds선택 사항입니다.
bucketRoundingSeconds와 함께granularity의 대안으로 사용합니다. 같은 버킷에 있는 타임스탬프 사이의 최대 시간을 설정합니다.가능한 값은 1-31536000입니다.
버전 6.3에 추가.
bucketRoundingSeconds선택 사항.
bucketMaxSpanSeconds와 함께granularity의 대안으로 사용합니다.bucketMaxSpanSeconds와 같아야 합니다.문서에 새 버킷이 필요한 경우 MongoDB는 문서의 타임스탬프 값을 이 간격으로 반올림하여 버킷의 최소 시간을 설정합니다.
버전 6.3에 추가.
중요
샤딩된 컬렉션은 출력 컬렉션으로 지정할 수 없습니다. 파이프라인의 입력 컬렉션은 샤딩할 수 있습니다. 샤딩된 컬렉션으로 출력하려면
$merge를 참조하세요.$out연산자는 제한된 고정 사이즈 컬렉션에 결과를 쓸 수 없습니다.Atlas Search 인덱스가 있는 컬렉션을 수정하는 경우 먼저 검색 인덱스를 삭제한 후 다시 만들어야 합니다. 대신
$merge사용을 고려해 보세요.
와(과) 비교하기 $merge
MongoDB는 집계 파이프라인의 결과를 컬렉션에 쓰기 위한 두 단계인 $merge 및 $out을 제공합니다. 다음은 두 단계의 기능을 요약한 것입니다.
$out | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
|
동작
$out 읽기 작업이 세컨더리 복제본 세트 멤버에서 실행
MongoDB 5.0부터 클러스터의 모든 노드에 featureCompatibilityVersion 이 5.0 이상으로 설정되어 있고 읽기 설정이 보조로 설정된 경우 복제본 세트 세컨더리 노드에서 $out을 실행할 수 있습니다.
$out 문의 읽기 연산은 세컨더리 노드에서 발생하는 반면 쓰기 연산은 프라이머리 노드에서만 발생합니다.
모든 버전의 드라이버가 복제본 세트 세컨더리 노드에 대한 $out 연산의 타겟팅을 지원하는 것은 아닙니다. 드라이버 설명서를 참조하여 드라이버가 세컨더리에서 실행 중인 $out에 대한 지원을 언제 추가했는지 확인하세요.
새 collection 만들기
$out 연산은 아직 컬렉션이 없는 경우 새 컬렉션을 만듭니다.
집계가 완료될 때까지 collection은 표시되지 않습니다. 집계이 실패하면 MongoDB는 collection을 생성하지 않습니다.
기존 collection 교체
$out 연산에서 지정한 컬렉션이 이미 존재하는 경우, 집계가 완료되면 $out 단계에서 기존 컬렉션을 새 결과 컬렉션으로 원자적으로 대체합니다. 구체적으로는 다음과 같은 $out 연산입니다.
임시 컬렉션을 생성합니다.
기존 collection의 인덱스를 임시 collection으로 복사합니다.
임시 컬렉션에 문서를 삽입합니다.
dropTarget: true와 함께renameCollection명령을 호출해 임시 컬렉션의 이름을 대상 컬렉션으로 지정합니다.
지정된 컬렉션이 존재하고 $out 연산이 timeseries 옵션을 지정하는 경우 다음 제한 사항이 적용됩니다.
기존 컬렉션은 Time Series 컬렉션이어야 합니다.
기존 컬렉션은 뷰가 아니어야 합니다.
$out단계에 포함된timeseries옵션은 기존 컬렉션의 옵션과 정확히 일치해야 합니다.
$out 연산은 이전 컬렉션에 있던 인덱스를 변경하지 않습니다. 집계가 실패하면 $out 연산은 기존 컬렉션에 변경 사항을 만들지 않습니다.
스키마 유효성 검사 오류
coll 컬렉션에서 스키마 유효성 검사를 사용하고 validationAction을 error로 설정한 경우 $out으로 잘못된 문서를 삽입하면 오류가 발생합니다. $out 작업은 기존 컬렉션을 변경하지 않으며 집계 파이프라인에서 반환된 문서는 coll 컬렉션에 추가되지 않습니다.
인덱스 제약
파이프라인에서 생성한 문서가 원래 출력 컬렉션의 _id 필드에 있는 고유 인덱스를 비롯해 그 어떤 고유 인덱스라도 위반할 경우 파이프라인이 완료되지 않습니다.
연산으로 $out Atlas Search 인덱스가 있는 컬렉션을 수정하는 경우 검색 인덱스를 삭제하고 다시 만들어야 합니다. 대신 $merge 사용을 고려해 보세요.
majority readConcern
$out 단계를 포함하는 "majority" 집계에 대해 읽기 고려 수준을 지정할 수 있습니다.
다음과의 상호 작용 mongodump
클라이언트가 덤프 프로세스 중에 $out을 포함하는 집계 파이프라인을 실행하면 --oplog로 시작한 mongodump가 실패합니다. 자세한 내용은 mongodump --oplog를 참조하세요.
제한 사항
제한 사항 | 설명 |
|---|---|
집계 파이프라인은 트랜잭션 내부에서 | |
이전 MongoDB 버전에서는 7.0.3 집계 파이프라인 를 사용하여 | |
| |
| |
|
|
|
|
예시
test 데이터베이스에서 다음 문서를 사용해 컬렉션 books를 생성합니다.
db.getSiblingDB("test").books.insertMany([ { "_id" : 8751, "title" : "The Banquet", "author" : "Dante", "copies" : 2 }, { "_id" : 8752, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 }, { "_id" : 8645, "title" : "Eclogues", "author" : "Dante", "copies" : 2 }, { "_id" : 7000, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 }, { "_id" : 7020, "title" : "Iliad", "author" : "Homer", "copies" : 10 } ])
test 데이터베이스가 아직 존재하지 않는 경우, 삽입 작업을 수행하면 데이터베이스와 books 컬렉션이 생성됩니다.
동일한 데이터베이스로 출력하기
다음 집계 작업은 test 데이터베이스의 books collection에 있는 데이터를 피벗하여 제목을 저자별로 그룹화한 다음 그 결과를 test 데이터베이스의 authors collection에 씁니다.
db.getSiblingDB("test").books.aggregate( [ { $group : { _id : "$author", books: { $push: "$title" } } }, { $out : "authors" } ] )
- 첫 번째 단계 (
$group): $group단계는authors를 기준으로 그룹화하고$push를 사용하여 제목을books배열 필드에 추가합니다.{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] } { "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } - 두 번째 단계 (
$out): $out단계에서는test데이터베이스의authors컬렉션에 문서를 출력합니다.
출력 collection의 문서를 보려면 다음 작업을 실행합니다.
db.getSiblingDB("test").authors.find()
컬렉션에는 다음 문서가 포함되어 있습니다.
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } { "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }
다른 데이터베이스로 출력
참고
$out 는 집계가 실행되는 위치와 다른 데이터베이스의 컬렉션으로 출력할 수 있습니다.
다음 집계 작업은 books 컬렉션의 데이터를 피벗하여 제목이 작성자별로 그룹화한 다음 reporting 데이터베이스의 authors 컬렉션에 결과를 씁니다.
db.getSiblingDB("test").books.aggregate( [ { $group : { _id : "$author", books: { $push: "$title" } } }, { $out : { db: "reporting", coll: "authors" } } ] )
- 첫 번째 단계 (
$group): $group단계는authors를 기준으로 그룹화하고$push를 사용하여 제목을books배열 필드에 추가합니다.{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] } { "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } - 두 번째 단계 (
$out): $out단계에서는reporting데이터베이스의authors컬렉션에 문서를 출력합니다.
출력 collection의 문서를 보려면 다음 작업을 실행합니다.
db.getSiblingDB("reporting").authors.find()
컬렉션에는 다음 문서가 포함되어 있습니다.
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } { "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }
이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.
다음 Movie 클래스는 sample_mflix.movies 컬렉션의 문서를 모델링합니다.
public class Movie { public ObjectId Id { get; set; } public int Runtime { get; set; } public string Title { get; set; } public string Rated { get; set; } public List<string> Genres { get; set; } public string Plot { get; set; } public ImdbData Imdb { get; set; } public int Year { get; set; } public int Index { get; set; } public string[] Comments { get; set; } [] public DateTime LastUpdated { get; set; } }
참고
Pascal Case를 위한 ConventionPack
이 페이지의 C# 클래스는 속성 이름에 파스칼 표기법을 사용하지만, MongoDB 컬렉션의 필드 이름은 카멜 표기법을 사용합니다. 이 차이를 해결하기 위해 애플리케이션이 시작될 때 다음 코드를 사용하여 ConventionPack을 등록할 수 있습니다.
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
MongoDB .NET/ C# 운전자 사용하여 $out 집계 파이프라인 에 단계를 추가하려면 PipelineDefinition 객체 에서 Out() 메서드를 호출합니다.
다음 예시 파이프 파이프라인 결과를 movies 컬렉션 에 기록하는 파이프라인 단계를 만듭니다.
var movieCollection = client .GetDatabase("sample_mflix") .GetCollection<Movie>("movies"); var pipeline = new EmptyPipelineDefinition<Movie>() .Out(movieCollection);
이 페이지의 Node.js 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB Node.js 운전자 설명서에서 시작하기 를 참조하세요.
MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $out 단계를 추가하려면 파이프라인 객체 에서 $out 연산자 사용합니다.
다음 예시에서는 파이프라인의 결과를 movies 컬렉션에 쓰는 파이프라인 단계를 만듭니다. 그리고 집계 파이프라인을 실행합니다.
const pipeline = [{ $out: { db: "sample_mflix", coll: "movies" } }]; const cursor = collection.aggregate(pipeline); return cursor;