문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

$out (aggregation)

이 페이지의 내용

  • 정의
  • 구문
  • 동작
  • 예제
$out

집계 파이프라인에서 반환한 문서를 가져와서 지정된 collection에 씁니다. 출력 데이터베이스를 지정할 수 있습니다.

$out 단계는 파이프라인 의 마지막 단계 여야 합니다. $out 연산자를 사용하면 애그리게이션 프레임워크에서 모든 크기의 결과 세트를 반환할 수 있습니다.

$out 단계의 구문은 다음과 같습니다.

  • $out 은(는) 출력 데이터베이스와 출력 collection을 지정하는 문서를 사용할 수 있습니다.

    { $out: { db: "<output-db>", coll: "<output-collection>" } }
    필드
    설명
    db

    출력 데이터베이스의 이름입니다.

    • 복제본 세트 또는 독립형의 경우 출력 데이터베이스가 존재하지 않으면 $out 가 데이터베이스도 생성합니다.

    • 샤딩된 클러스터의 경우 지정된 출력 데이터베이스가 이미 존재해야 합니다.

    출력 collection 이름입니다.

  • $out 출력 collection만 지정하는 문자열을 사용할 수 있습니다(즉, 동일한 데이터베이스의 collection으로 출력).

    { $out: "<output-collection>" } // Output collection is in the same database

중요

  • 샤드된 컬렉션은 출력 컬렉션으로 지정할 수 없습니다. 파이프라인의 입력 컬렉션은 샤딩할 수 있습니다. 샤드된 컬렉션으로 출력하려면 $merge(MongoDB 4.2부터 사용 가능)를 참조하세요.

  • $out 연산자는 고정 사이즈 컬렉션에 결과를 쓸 수 없습니다.

  • Atlas Search 인덱스가 있는 컬렉션을 수정하는 경우 먼저 검색 인덱스를 삭제한 다음 다시 만들어야 합니다. 대신 $merge 를 사용하는 것이 좋습니다.

버전 4 에 $merge 가 도입되었습니다.2, MongoDB는 집계 파이프라인의 결과를 collection에 쓰기 위해 $merge$out 의 두 단계를 제공합니다. 다음은 두 단계의 기능을 요약한 것입니다.

  • 동일하거나 다른 데이터베이스의 컬렉션으로 출력할 수 있습니다.

  • 동일하거나 다른 데이터베이스의 컬렉션으로 출력할 수 있습니다.

  • 출력 컬렉션이 아직 존재하지 않는 경우 새 컬렉션을 생성합니다.

  • 출력 컬렉션이 아직 존재하지 않는 경우 새 컬렉션을 생성합니다.

  • 출력 컬렉션이 이미 있는 경우 완전히 바꿉니다.

  • 결과(새 문서 삽입, 문서 병합, 문서 교체, 기존 문서 유지, 작업 실패, 사용자 지정 업데이트 파이프라인으로 문서 처리)를 기존 컬렉션에 통합할 수 있습니다.

    collection의 콘텐츠를 바꿀 수 있지만 애그리게이션 결과에 collection의 모든 기존 문서와 일치하는 항목이 포함된 경우에만 가능합니다.

  • 출력 대상 컬렉션은 샤딩될 수 없습니다. 그러나 입력 컬렉션은 샤딩될 수 있습니다.

  • 샤드된 컬렉션으로 출력할 수 있습니다. 입력 컬렉션도 샤딩할 수 있습니다.

  • 다음 SQL 문에 해당합니다.

    • INSERT INTO T2 SELECT * FROM T1
    • SELECT * INTO T2 FROM T1
  • 다음 SQL 문에 해당합니다.

    • MERGE T2 AS TARGET
      USING (SELECT * FROM T1) AS SOURCE
      ON MATCH (T2.ID = SOURCE.ID)
      WHEN MATCHED THEN
      UPDATE SET TARGET.FIELDX = SOURCE.FIELDY
      WHEN NOT MATCHED THEN
      INSERT (FIELDX)
      VALUES (SOURCE.FIELDY)
    • 구체화된 뷰 만들기/새로 고침

MongoDB 5 부터 시작.0, $out 는 클러스터의 모든 노드에 featureCompatibilityVersion5.0 이상으로 설정되어 있고 읽기 기본 설정 이 세컨더리로 설정된 경우 복제본 세트 세컨더리 노드에서 실행할 수 있습니다.

$out 문의 읽기 작업은 세컨더리 노드에서 발생하지만 쓰기 작업은 프라이머리 노드에서만 발생합니다.

모든 드라이버 버전이 복제본 세트 세컨더리 노드에 대한 $out 작업 대상 지정을 지원하는 것은 아닙니다. 드라이버 설명서를 확인하여 드라이버가 세컨더리에서 실행 중인 $out 에 대한 지원을 언제 추가했는지 확인합니다.

$out 작업은 컬렉션이 아직 존재하지 않는 경우 새 컬렉션을 만듭니다.

애그리게이션이 완료될 때까지 collection은 표시되지 않습니다. 애그리게이션이 실패하면 MongoDB는 collection을 생성하지 않습니다.

$out 연산에서 지정한 컬렉션이 이미 존재하는 경우, 애그리게이션이 완료되면 $out 단계에서 기존 컬렉션을 새 결과 컬렉션으로 원자적으로 대체합니다. 구체적으로 $out 연산은 다음과 같습니다.

  1. 임시 컬렉션을 생성합니다.

  2. 기존 collection의 인덱스를 임시 collection으로 복사합니다.

  3. 임시 컬렉션에 문서를 삽입합니다.

  4. dropTarget: true와 함께 renameCollection 명령을 호출해 임시 컬렉션의 이름을 대상 컬렉션으로 지정합니다.

$out 작업은 이전 컬렉션에 있던 인덱스를 변경하지 않습니다. 애그리게이션이 실패하면 $out 작업은 기존 컬렉션을 변경하지 않습니다.

파이프라인에서 생성한 문서가 원래 출력 컬렉션의 _id 필드에 있는 고유 인덱스를 비롯해 그 어떤 고유 인덱스라도 위반할 경우 파이프라인이 완료되지 않습니다.

$out 작업이 Atlas Search 인덱스가 있는 컬렉션을 수정하는 경우 검색 인덱스를 삭제하고 다시 만들어야 합니다. 대신 $merge 를 사용하는 것이 좋습니다.

MongoDB 부터 4 2시작.단계를 $out 포함하는 애그리게이션에 대해 "majority" 읽기 고려 수준 을 지정할 수 있습니다.

클라이언트가 덤프 프로세스 중에 를 포함하는 집계 파이프라인을 실행하면 mongodump --oplog $out 로 시작된 는 실패합니다. 자세한 mongodump --oplog 내용은 를 참조하세요.

제한 사항
설명
집계 파이프라인은 트랜잭션 내에서 를 사용할 $out 수 없습니다.
집계 파이프라인은 $out 를 사용하여 time series 컬렉션으로 출력할 수 없습니다.
$out 단계는 뷰 정의 의 일부로 허용되지 않습니다. 뷰 정의에 중첩된 파이프라인이 포함된 경우(예: 뷰 정의에 $lookup 또는 $facet 단계가 포함된 경우) 이 $out 단계 제한은 중첩된 파이프라인에도 적용됩니다.
$lookup 단계
부터 4 시작됩니다. ,2 단계의 중첩된 파이프라인 $lookup 에 단계를 포함할 $out수 없습니다.
$facet 단계
$facet 단계의 중첩된 파이프라인 에는 $out 단계가 포함될 수 없습니다.
$unionWith 단계
$unionWith 단계의 중첩된 파이프라인 에는 $out 단계가 포함될 수 없습니다.
"linearizable" readConcern

MongoDB 부터 4 시작.2, 단계는 $out 읽기 고려 와 함께 사용할 수 "linearizable" 없습니다. 즉,"linearizable" 에 읽기 db.collection.aggregate() 고려를 지정하면 $out 파이프라인에 단계를 포함할 수 없습니다.

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 애그리게이션이 실행되는 위치와 다른 데이터베이스의 collection으로 출력할 수 있습니다.

다음 애그리게이션 작업은 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" ] }
← $merge (aggregation)

이 페이지의 내용