문서 메뉴

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

$out (aggregation)

이 페이지의 내용

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

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

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

경고

$out 연산에서 지정한 컬렉션이 이미 존재하는 경우 $out 단계에서는 집계가 완료되면 기존 컬렉션을 새 결과 컬렉션으로 원자적으로 대체합니다. 자세한 내용은 기존 컬렉션 교체를 참조하세요.

$out 단계에는 다음과 같은 구문이 있습니다.

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

    { $out: "<output-collection>" } // Output collection is in the same database
  • $out 은(는) 출력 데이터베이스와 출력 collection을 지정하는 문서를 사용할 수 있습니다.

    { $out: { db: "<output-db>", coll: "<output-collection>" } }
  • MongoDB 7.0.3 및 7.1부터 $out은 문서를 가져와 time series 컬렉션으로 출력할 수 있습니다.

    { $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과 같지 않을 수 있습니다. 필드는 모든 유형이 가능합니다.

    granularity

    선택 사항입니다. bucketRoundingSecondsbucketMaxSpanSeconds 을 설정한 경우에는 사용하지 마십시오.

    가능한 값은 seconds (기본값), minuteshours입니다.

    연속적으로 들어오는 타임스탬프 사이의 시간과 가장 근접하게 일치하는 값으로 granularity 를 설정합니다. 이렇게 하면 MongoDB가 컬렉션에 데이터를 저장하는 방법을 최적화하여 성능이 향상됩니다.

    세분 수준 및 버킷 간격에 대한 자세한 내용은 Time Series 데이터의 세부 수준 설정을 참조하세요.

    bucketMaxSpanSeconds

    선택 사항입니다. bucketRoundingSeconds와 함께 granularity의 대안으로 사용합니다. 같은 버킷에 있는 타임스탬프 사이의 최대 시간을 설정합니다.

    가능한 값은 1-31536000입니다.

    버전 6.3에 추가.

    bucketRoundingSeconds

    선택 사항. bucketMaxSpanSeconds와 함께 granularity의 대안으로 사용합니다. bucketMaxSpanSeconds와 같아야 합니다.

    문서에 새 버킷이 필요한 경우 MongoDB는 문서의 타임스탬프 값을 이 간격으로 반올림하여 버킷의 최소 시간을 설정합니다.

    버전 6.3에 추가.

중요

  • 샤딩된 컬렉션은 출력 컬렉션으로 지정할 수 없습니다. 파이프라인의 입력 컬렉션은 샤딩할 수 있습니다. 샤딩된 컬렉션으로 출력하려면 $merge를 참조하세요.

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

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

MongoDB는 집계 파이프라인의 결과를 컬렉션에 쓰기 위한 두 단계인 $merge$out을 제공합니다. 다음은 두 단계의 기능을 요약한 것입니다.

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

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

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

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

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

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

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

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

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

  • MongoDB 7.0.3 및 7.1부터 time series 컬렉션으로 출력할 수 있습니다.

  • time series 컬렉션으로 출력할 수 없습니다.

  • 다음 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부터 클러스터의 모든 노드에 featureCompatibilityVersion5.0 이상으로 설정되어 있고 읽기 설정이 보조로 설정된 경우 복제본 세트 세컨더리 노드에서 $out을 실행할 수 있습니다.

$out 문의 읽기 연산은 세컨더리 노드에서 발생하는 반면 쓰기 연산은 프라이머리 노드에서만 발생합니다.

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

$out 연산은 아직 컬렉션이 없는 경우 새 컬렉션을 만듭니다.

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

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

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

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

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

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

지정된 컬렉션이 존재하고 $out 연산이 timeseries 옵션을 지정하는 경우 다음 제한 사항이 적용됩니다.

  1. 기존 컬렉션은 Time Series 컬렉션이어야 합니다.

  2. 기존 컬렉션은 뷰가 아니어야 합니다.

  3. $out 단계에 포함된 timeseries 옵션은 기존 컬렉션의 옵션과 정확히 일치해야 합니다.

$out 연산은 이전 컬렉션에 있던 인덱스를 변경하지 않습니다. 집계가 실패하면 $out 연산은 기존 컬렉션에 변경 사항을 만들지 않습니다.

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

$out 연산으로 Atlas Search 인덱스가 있는 컬렉션을 수정하는 경우 검색 인덱스를 삭제하고 다시 만들어야 합니다. 대신 $merge 사용을 고려할 수 있습니다.

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

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

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

단계는 $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)

이 페이지의 내용