$out (집계)
정의
$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
메서드를 사용하여 세분성을 수정할 수 있습니다. 그러나 각 버킷에 적용되는 기간을 늘릴 수만 있습니다. 줄일 수는 없습니다.필드설명db
출력 데이터베이스의 이름입니다.
복제본 세트 또는 독립형의 경우 출력 데이터베이스가 존재하지 않으면
$out
도 데이터베이스를 생성합니다.
coll
출력 collection 이름입니다.
timeseries
Time Series 컬렉션에 쓸 때 사용할 구성을 지정하는 문서입니다.
timeField
는 필수 항목입니다. 다른 모든 필드는 선택 사항입니다.timeField
time series 컬렉션에 쓸 때 필요합니다. .. 포함:: /includes/time-series/fact-time-field-description.rst
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
를 참조하세요.
제한 사항
제한 사항 | 설명 |
---|---|
집계 파이프라인은 트랜잭션 내부에서 $out 을 사용할 수 없습니다. | |
$lookup 단계 | |
$facet 단계 | |
$unionWith 단계 | |
"linearizable" readConcern |
|
예시
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
도 데이터베이스를 생성합니다.
$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" ] }