$out (집계)
정의
$out
집계 파이프라인에서 반환된 문서를 가져와서 지정된 컬렉션에 씁니다. 출력 데이터베이스를 지정할 수 있습니다.
$out
단계는 파이프라인 의 마지막 단계 여야 합니다.$out
연산자를 사용하면 애그리게이션 프레임워크에서 모든 크기의 결과 세트를 반환할 수 있습니다.경고
$out
은(는) 지정된 컬렉션 이 있는 경우 이를 대체합니다. 자세한 내용은 기존 컬렉션 바꾸기 를 참조하세요.
구문
$out
단계의 구문은 다음과 같습니다.
$out
출력 데이터베이스와 출력 컬렉션을 지정하기 위해 문서를 가져올 수 있습니다.{ $out: { db: "<output-db>", coll: "<output-collection>" } } 필드설명출력 데이터베이스의 이름입니다.
복제본 세트 또는 독립형 의 경우 출력 데이터베이스 가 존재하지 않으면
$out
가 데이터베이스 도 생성합니다.샤딩된 클러스터의 경우 지정된 출력 데이터베이스가 이미 존재해야 합니다.
출력 collection 이름입니다.
$out
출력 collection만 지정하는 문자열을 사용할 수 있습니다(즉, 동일한 데이터베이스의 collection으로 출력).{ $out: "<output-collection>" } // Output collection is in the same database
중요
샤드된 컬렉션은 출력 컬렉션으로 지정할 수 없습니다. 파이프라인의 입력 컬렉션은 샤딩할 수 있습니다. 샤드된 컬렉션으로 출력하려면
$merge
(MongoDB 4.2부터 사용 가능)를 참조하세요.Atlas Search 인덱스가 있는 컬렉션을 수정하는 경우 먼저 검색 인덱스를 삭제한 후 다시 만들어야 합니다. 대신
$merge
사용을 고려해 보세요.
와(과) 비교하기 $merge
버전 4.2 에 $merge
가 도입되면서, MongoDB는 집계 파이프라인의 결과를 컬렉션에 쓰기 위해 $merge
및 $out
두 단계를 제공합니다. 다음은 두 단계의 기능을 요약한 것입니다.
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
|
동작
$out 읽기 작업이 세컨더리 복제본 세트 멤버에서 실행
MongoDB 부터 클러스터의 5.0 $out
모든 노드에 featureCompatibilityVersion 5.0
이 이상으로 설정되어 있고 읽기 기본 설정 이 세컨더리로 설정된 경우 복제본 세트 세컨더리 노드에서 를 실행할 수 있습니다.
$out
문의 읽기 작업은 세컨더리 노드에서 발생하지만 쓰기 작업은 프라이머리 노드에서만 발생합니다.
모든 드라이버 버전이 복제본 세트 세컨더리 노드에 대한 $out
작업 대상 지정을 지원하는 것은 아닙니다. 드라이버 설명서를 확인하여 드라이버가 세컨더리에서 실행 중인 $out
에 대한 지원을 언제 추가했는지 확인합니다.
새 collection 만들기
$out
작업은 컬렉션이 아직 존재하지 않는 경우 새 컬렉션을 만듭니다.
집계가 완료될 때까지 collection은 표시되지 않습니다. 집계이 실패하면 MongoDB는 collection을 생성하지 않습니다.
기존 collection 교체
$out
연산에서 지정한 컬렉션이 이미 존재하는 경우, 애그리게이션이 완료되면 $out
단계에서 기존 컬렉션을 새 결과 컬렉션으로 원자적으로 대체합니다. 구체적으로 $out
연산은 다음과 같습니다.
임시 컬렉션을 생성합니다.
기존 collection의 인덱스를 임시 collection으로 복사합니다.
임시 컬렉션에 문서를 삽입합니다.
dropTarget: true
와 함께renameCollection
명령을 호출해 임시 컬렉션의 이름을 대상 컬렉션으로 지정합니다.
$out
작업은 이전 컬렉션에 있던 인덱스를 변경하지 않습니다. 애그리게이션이 실패하면 $out
작업은 기존 컬렉션을 변경하지 않습니다.
스키마 유효성 검사 오류
coll
컬렉션에서 스키마 유효성 검사를 사용하고 validationAction
을 error
로 설정한 경우 $out
으로 잘못된 문서를 삽입하면 오류가 발생합니다. $out
작업은 기존 컬렉션을 변경하지 않으며 집계 파이프라인에서 반환된 문서는 coll
컬렉션에 추가되지 않습니다.
인덱스 제약
파이프라인에서 생성한 문서가 원래 출력 컬렉션의 _id
필드에 있는 고유 인덱스를 비롯해 그 어떤 고유 인덱스라도 위반할 경우 파이프라인이 완료되지 않습니다.
$out
작업으로 Atlas Search 인덱스가 있는 컬렉션을 수정하는 경우 Atlas Search 인덱스를 삭제하고 다시 만들어야 합니다. 대신 $merge
를 사용하는 것이 좋습니다.
majority
readConcern
$out
단계를 포함하는 "majority"
집계에 대해 읽기 고려 수준을 지정할 수 있습니다.
다음과의 상호 작용 mongodump
클라이언트가 덤프 프로세스 중에 를 포함하는 집계 파이프라인을 실행하면 mongodump
--oplog
$out
로 시작된 는 실패합니다. 자세한 내용은 mongodump --oplog
를 참조하세요.
제한 사항
제한 사항 | 설명 |
---|---|
집계 파이프라인 은 를 | |
| |
| |
|
|
|
|
예시
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" ] }