$merge
이 페이지의 내용
$merge
집계 파이프라인 의 결과를 Atlas cluster 의 임시 컬렉션 에 씁니다. 그런 다음 Atlas Data Federation 은 Atlas cluster 에서 로컬로 $merge
를 실행 하여 청크 단위의 데이터를 대상 컬렉션 에 병합합니다. $merge
작업 중에 오류가 이벤트 하면 최소한 일부 데이터가 대상 컬렉션 에 기록됩니다.
Atlas Data Federation에서 $merge
는 다음을 수행할 수 있습니다.
지원되는 연합 데이터베이스 인스턴스 저장소 중 하나에서 데이터를 씁니다.
동일한 Atlas 프로젝트 내에서 동일하거나 다른 Atlas 클러스터, 데이터베이스 또는 컬렉션에 씁니다.
Atlas Data Federation은 Atlas cluster에 쓰기를 허용하기 위해 필수 into
필드에 대체 구문 을 도입합니다. Atlas Data Federation은 $merge
에 설명된 대로 다른 모든 필드를 지원합니다.
학습 내용은 $merge
파이프라인 단계를 참조하세요.
필요한 권한
$merge
를 사용하여 Atlas cluster의 컬렉션에 쓰려면 다음 권한을 가진 데이터베이스 사용자여야 합니다.
고려 사항
집계 이 실패하면 Atlas Data Federation 은 오류가 발생하기 전에 $merge
가 완료한 쓰기를 롤백하지 않습니다.
구문
{ "$merge": { "into": { "atlas": { "projectId": "<atlas-project-ID>", "clusterName": "<atlas-cluster-name>", "db": "<atlas-database-name>", "coll": "<atlas-collection-name>" } }, "on": "<identifier field>"|[ "<identifier field1>", ...], "let": { <variables> }, "whenMatched": "replace|keepExisting|merge|fail|pipeline", "whenNotMatched": "insert|discard|fail" } }
필드
이 섹션에서는 Atlas Data Federation이 into
필드에 제공하는 대체 구문을 설명합니다.
필드 | 유형 | 설명 | 필요성 |
---|---|---|---|
| 객체 | 집계 파이프라인에서 문서를 작성할 위치입니다. | 필수 사항 |
| 문자열 | Atlas 클러스터의 이름. | 필수 사항 |
| 문자열 | Atlas 클러스터에 있는 컬렉션의 이름입니다. | 필수 사항 |
| 문자열 | 컬렉션이 포함된 Atlas 클러스터의 데이터베이스 이름입니다. | 필수 사항 |
| 문자열 | Atlas 클러스터가 포함된 프로젝트의 고유 식별자입니다. 이는 연합 데이터베이스 인스턴스가 포함된 프로젝트의 ID입니다. 생략하면 연합 데이터베이스 인스턴스가 포함된 프로젝트의 ID가 기본값이 됩니다. | 옵션 |
다른 필드 on
, let
, whenMatched
및 whenNotMatched
에 대해 자세히 알아보려면 $merge
에 대한 MongoDB 서버 설명서를 참조하세요.
참고
여러 필드에서 on
를 사용하려면 ``on`` 식별자 필드에 복합 고유 인덱스 를 만들어야 합니다.
옵션
옵션 | 유형 | 설명 | 필요성 | |
---|---|---|---|---|
| 부울 | 백그라운드에서 집계 작업을 실행하도록 플래그를 지정합니다. 생략하면 기본값은
쿼리가 백그라운드에서 계속 실행되는 동안 현재 실행 중인 쿼리가 완료되거나 연합 데이터베이스 인스턴스 연결이 끊길 때까지 기다리지 않고 다른 새 쿼리를 제출하려는 경우 이 옵션을 사용하십시오. | 옵션 |
중복 문서 ID 해결
아카이브 또는 데이터 저장소에서 Atlas 클러스터로 문서를 작성할 때 문서에 중복된 _id
필드가 있을 수 있습니다. 이 섹션에서는 Atlas Data Federation이 중복을 해결하는 방법과 집계 파이프라인에서 중복을 해결하기 위한 권장 사항을 설명합니다.
Atlas Data Federation에서 중복 ID 확인
Atlas Data Federation은 중복을 해결하기 위해 다음을 수행합니다.
문서를 받는 순서대로 중복이 발견될 때까지 문서를 받는 순서대로 Atlas 컬렉션
X
에 문서를 씁니다.중복된
_id
필드가 있는 문서와 모든 후속 문서를 새 Atlas 컬렉션Y
에 씁니다.지정된
$merge
단계를 실행하여 컬렉션Y
를 컬렉션X
에 병합합니다.결과 문서를 지정된 Atlas 클러스터의 대상 컬렉션에 씁니다.
참고
Atlas Data Federation은 _id
필드에서 중복된 값만 확인합니다. 고유 인덱스가 있는 다른 필드의 중복 값은 해결되지 않습니다.
중복 ID 수정하기
다음을 수행하여 중복된 _id
필드를 수정할 수 있습니다.
파이프라인에
$sort
단계를 포함하여 Atlas Data Federation이 결과 문서를 처리해야 하는 순서를 지정합니다.$merge
단계로 유입되는 문서의 순서에 따라$merge
단계의whenMatched
및whenNotMatched
옵션 값을 신중하게 선택합니다.예시
다음 예시에서는
whenMatched
옵션이keepExisting
또는replace
로 설정된 경우 Atlas Data Federation이$merge
단계에서 중복을 해결하는 방법을 보여 줍니다. 이 예시에서는 다음 문서를 사용합니다.{ "_id" : 1, "state" : "FL" }, { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } 위에 나열된 문서에 대해 다음 파이프라인을 실행한다고 가정해 보겠습니다.
db.s3coll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "keepExisting", "whenNotMatched": "insert" } } ]) Atlas Data Federation은
X
및Y
라는 두 컬렉션에 다음 데이터를 씁니다.{ "_id" : 1, "state" : "FL" } { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } 그런 다음 Atlas Data Federation은
Y
컬렉션의 문서를X
컬렉션으로 병합합니다. 파이프라인의whenMatched: keepExisting
옵션의 경우, Atlas Data Federation은 컬렉션X
에_id: 1
이(가) 있는 기존 문서를 유지합니다. 따라서 중복 항목이 있는 파이프라인의 결과에는 다음 문서가 포함됩니다.{ "_id" : 1, "state" : "FL" }, { "_id" : 2, "state" : "TX" } 그런 다음 Atlas Data Federation은 이러한 문서를 지정된 Atlas 클러스터의 대상 컬렉션에 병합합니다.
위에 나열된 문서에 대해 다음 파이프라인을 실행한다고 가정해 보겠습니다.
db.s3coll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "replace", "whenNotMatched": "insert" } } ]) Atlas Data Federation은
X
및Y
라는 두 컬렉션에 다음 데이터를 씁니다.{ "_id" : 1, "state" : "FL" } { "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } Atlas Data Federation은
Y
컬렉션의 문서를X
컬렉션으로 병합합니다. 파이프라인의whenMatched: replace
옵션의 경우 Atlas Data Federation은 컬렉션X
의_id: 1
문서를 컬렉션Y
의_id: 1
이 있는 문서로 대체합니다. 따라서 중복 항목이 있는 파이프라인의 결과에는 다음 문서가 포함됩니다.{ "_id" : 1, "state" : "NJ" }, { "_id" : 2, "state" : "TX" } 그런 다음 Atlas Data Federation은 이러한 문서를 지정된 Atlas 클러스터의 대상 컬렉션에 병합합니다.
whenNotMatched: discard
옵션은 사용하지 않는 것이 좋습니다.예시
이 예시에서는 다음 문서를 사용하여
whenNotMatched
옵션이discard
로 설정된 경우 Atlas Data Federation이 중복을 해결하는 방법을 보여 줍니다.{ "_id" : 1, "state" : "AZ" }, { "_id" : 1, "state" : "CA" }, { "_id" : 2, "state" : "NJ" }, { "_id" : 3, "state" : "NY" }, { "_id" : 4, "state" : "TX" } 위에 나열된 문서에 대해 다음 파이프라인을 실행한다고 가정해 보겠습니다.
db.archivecoll.aggregate([ { "$sort": { "_id": 1, "state": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "clustername", "db": "clusterdb", "coll": "clustercoll" } }, "on": "_id", "whenMatched": "replace", "whenNotMatched": "discard" } } ]) Atlas Data Federation은
X
및Y
라는 두 컬렉션에 다음 데이터를 씁니다.{ "_id" : 1, "state" : "AZ" // gets replaced } { "_id" : 1, "state" : "CA" } { "_id" : 2, "state" : "NJ" // gets discarded } { "_id" : 3, "state" : "NY" // gets discarded } { "_id" : 4, "state" : "TX" // gets discarded } Atlas Data Federation은
Y
컬렉션의 문서를X
컬렉션으로 병합합니다. 파이프라인의whenMatched: replace
옵션의 경우 Atlas Data Federation은 컬렉션X
의_id: 1
문서를 컬렉션Y
의_id: 1
이 있는 문서로 대체합니다. 파이프라인의whenNotMatched: discard
옵션의 경우 Atlas Data Federation은 컬렉션X
의 문서와 일치하지 않는 컬렉션Y
의 문서를 삭제합니다. 따라서 중복 항목이 있는 파이프라인의 결과에는 다음 문서가 포함됩니다.{ "_id" : 1, "state" : "CA" } 그런 다음 Atlas Data Federation은 이 문서를 지정된 Atlas 클러스터의 대상 컬렉션에 병합합니다.
예시
(으)로 데이터 병합 $merge
다음 예시 $merge
구문은 이름이 myTestCluster
인 Atlas cluster 의 sampleDB.mySampleData
컬렉션 에 결과를 씁니다. 이 예시 에서는 프로젝트 ID 를 지정하지 않습니다. $merge
단계에서는 연합 데이터베이스 인스턴스 가 포함된 프로젝트 의 ID 를 사용합니다.
예시
1 db.mySampleData.aggregate( 2 [ 3 { 4 "$merge": { 5 "into": { 6 "atlas": { 7 "clusterName": "myTestCluster", 8 "db": "sampleDB", 9 "coll": "mySampleData" 10 } 11 }, 12 ... 13 } 14 } 15 ] 16 )
배경 에서 $merge
실행
다음 예시 $merge
구문은 배경 에서 이름이 myTestCluster
인 Atlas cluster 의 sampleDB.mySampleData
컬렉션 에 결과를 씁니다. 이 예시 에서는 프로젝트 ID 를 지정하지 않습니다. $merge
단계에서는 연합 데이터베이스 인스턴스 가 포함된 프로젝트 의 ID 를 사용합니다.
예시
1 db.mySampleData.aggregate( 2 [ 3 { 4 "$merge": { 5 "into": { 6 "atlas": { 7 "clusterName": "myTestCluster", 8 "db": "sampleDB", 9 "coll": "mySampleData" 10 } 11 }, 12 ... 13 } 14 } 15 ], 16 { "background" : true } 17 )