정의
구문
$unionWith 단계에는 다음과 같은 구문이 있습니다.
{ $unionWith: { coll: "<collection>", pipeline: [ <stage1>, ... ] } } 
처리하지 않고 지정된 collection의 모든 문서를 포함하려면 간단한 양식을 사용할 수 있습니다.
{ $unionWith: "<collection>" }  // Include all documents from the specified collection 
$unionWith 단계에서는 다음 필드가 있는 문서를 사용합니다.
| 필드 | 필요성 | 설명 | 
|---|---|---|
| 
 | 결과 설정하다 에 포함하려는 파이프라인 결과가 있는 컬렉션 또는 뷰입니다. 
 | |
| 
 | 입력 문서에 적용할 집계 파이프라인입니다. 
 파이프라인 및 단계를  | 
$unionWith 작업은 다음 SQL 문에 해당합니다.
SELECT * FROM Collection1 WHERE ... UNION ALL SELECT * FROM Collection2 WHERE ... 
고려 사항
중복 결과
이전 단계와 $unionWith 단계의 결과를 합친 결과에는 중복이 포함될 수 있습니다.
예를 들어 suppliers collection과 warehouses collection을 만듭니다.
db.suppliers.insertMany([   { _id: 1, supplier: "Aardvark and Sons", state: "Texas" },   { _id: 2, supplier: "Bears Run Amok.", state: "Colorado"},   { _id: 3, supplier: "Squid Mark Inc. ", state: "Rhode Island" }, ]) 
db.warehouses.insertMany([   { _id: 1, warehouse: "A", region: "West", state: "California" },   { _id: 2, warehouse: "B", region: "Central", state: "Colorado"},   { _id: 3, warehouse: "C", region: "East", state: "Florida" }, ]) 
다음 집계는 suppliers 및 warehouse collection의 state 필드 프로젝션 결과를 결합합니다.
db.suppliers.aggregate([    { $project: { state: 1, _id: 0 } },    { $unionWith: { coll: "warehouses", pipeline: [ { $project: { state: 1, _id: 0 } } ]} } ]) 
결과 집합에 중복된 항목이 포함되어 있는 경우.
{ "state" : "Texas" } { "state" : "Colorado" } { "state" : "Rhode Island" } { "state" : "California" } { "state" : "Colorado" } { "state" : "Florida" } 
중복 항목을 제거하려면 $group 단계를 포함하여 state 필드별로 그룹화할 수 있습니다.
db.suppliers.aggregate([    { $project: { state: 1, _id: 0 } },    { $unionWith: { coll: "warehouses", pipeline: [ { $project: { state: 1, _id: 0 } } ]} },    { $group: { _id: "$state" } } ]) 
집합에 더 이상 중복된 항목이 포함되지 않는 경우.
 { "_id" : "California" }  { "_id" : "Texas" }  { "_id" : "Florida" }  { "_id" : "Colorado" }  { "_id" : "Rhode Island" } 
$unionWith 샤드 컬렉션
$unionWith 단계가 파이프라인 의 일부인 경우 $unionWith coll 을 샤딩된 할 수 없습니다. 예시 를 들어, 다음 집계 작업에서는 inventory_q1 컬렉션 샤딩된 할 수 없습니다.
db.suppliers.aggregate([    {       $lookup: {          from: "warehouses",          let: { order_item: "$item", order_qty: "$ordered" },          pipeline: [             ...             { $unionWith: { coll: "inventory_q1", pipeline: [ ... ] } },             ...          ],          as: "stockdata"       }    } ]) 
데이터 정렬
db.collection.aggregate() 에 데이터 정렬이 포함된 경우 다른 데이터 정렬은 무시하고 해당 데이터 정렬이 작업에 사용됩니다.
db.collection.aggregate()에 데이터 정렬이 포함되어 있지 않은 경우 db.collection.aggregate() 메서드는 db.collection.aggregate() 이(가) 실행되는 최상위 collection/view에 대해 데이터 정렬을 사용합니다.
- unionWith coll collection인 경우 해당 콜레이션은 무시됩니다. 
- $unionWith coll이 보기인 경우 해당 컬렉션의 데이터 정렬은 최상위 컬렉션/보기의 데이터 정렬과 일치해야 합니다. 그렇지 않으면 작동 오류가 발생합니다. 
Atlas Search 지원
MongoDB 6.0부터 $unionWith 파이프라인에서 Atlas Search $search 또는 $searchMeta 단계를 지정하여 Atlas 클러스터에서 컬렉션을 검색할 수 있습니다. $search 또는 $searchMeta 단계는 $unionWith 파이프라인 내의 첫 번째 단계여야 합니다.
$search를 사용한 $unionWith의 예시를 보려면 Atlas Search 튜토리얼 $unionWith를 사용하여 Atlas Search $search 쿼리 실행하기를 참조하세요.
경고
컬렉션 여러 샤드에 분산되어 있지 않은 경우, 하위 파이프라인에서 와 함께 를 $unionWith 사용하는 쿼리는 복제본 세트 에서 MongoDB v $search 7.0 을 실행 샤딩된 클러스터 로 업그레이드 동안 실패할 수 있습니다. 이를 완화하려면 클러스터 에 둘 이상의 샤드 배포 하고 여러 청크가 여러 샤드에 분산되도록 컬렉션 을 샤드 .
제한 사항
| 제한 사항 | 설명 | 
|---|---|
| 집계 파이프라인 트랜잭션 내에서 를 사용할 수 없습니다. | |
| 샤딩된 Collection | 
 | 
| $unionWith 파이프라인 단계를  | |
| $unionWith 파이프라인 단계를  | 
예시
Union of Yearly Data Collections에서 판매 보고서 만들기
다음 예시에서는 $unionWith 단계를 사용하여 collection을 결합하고 여러 컬렉션의 결과를 반환합니다. 이 예시에서 각 collection에는 1년간의 판매 데이터가 포함되어 있습니다.
샘플 데이터 채우기
- 다음 문서로 - sales_2017컬렉션을 생성합니다.- db.sales_2017.insertMany( [ - { store: "General Store", item: "Chocolates", quantity: 150 }, - { store: "ShopMart", item: "Chocolates", quantity: 50 }, - { store: "General Store", item: "Cookies", quantity: 100 }, - { store: "ShopMart", item: "Cookies", quantity: 120 }, - { store: "General Store", item: "Pie", quantity: 10 }, - { store: "ShopMart", item: "Pie", quantity: 5 } - ] ) 
- 다음 문서로 - sales_2018컬렉션을 생성합니다.- db.sales_2018.insertMany( [ - { store: "General Store", item: "Cheese", quantity: 30 }, - { store: "ShopMart", item: "Cheese", quantity: 50 }, - { store: "General Store", item: "Chocolates", quantity: 125 }, - { store: "ShopMart", item: "Chocolates", quantity: 150 }, - { store: "General Store", item: "Cookies", quantity: 200 }, - { store: "ShopMart", item: "Cookies", quantity: 100 }, - { store: "ShopMart", item: "Nuts", quantity: 100 }, - { store: "General Store", item: "Pie", quantity: 30 }, - { store: "ShopMart", item: "Pie", quantity: 25 } - ] ) 
- 다음 문서로 - sales_2019컬렉션을 생성합니다.- db.sales_2019.insertMany( [ - { store: "General Store", item: "Cheese", quantity: 50 }, - { store: "ShopMart", item: "Cheese", quantity: 20 }, - { store: "General Store", item: "Chocolates", quantity: 125 }, - { store: "ShopMart", item: "Chocolates", quantity: 150 }, - { store: "General Store", item: "Cookies", quantity: 200 }, - { store: "ShopMart", item: "Cookies", quantity: 100 }, - { store: "General Store", item: "Nuts", quantity: 80 }, - { store: "ShopMart", item: "Nuts", quantity: 30 }, - { store: "General Store", item: "Pie", quantity: 50 }, - { store: "ShopMart", item: "Pie", quantity: 75 } - ] ) 
- 다음 문서로 - sales_2020컬렉션을 생성합니다.- db.sales_2020.insertMany( [ - { store: "General Store", item: "Cheese", quantity: 100, }, - { store: "ShopMart", item: "Cheese", quantity: 100}, - { store: "General Store", item: "Chocolates", quantity: 200 }, - { store: "ShopMart", item: "Chocolates", quantity: 300 }, - { store: "General Store", item: "Cookies", quantity: 500 }, - { store: "ShopMart", item: "Cookies", quantity: 400 }, - { store: "General Store", item: "Nuts", quantity: 100 }, - { store: "ShopMart", item: "Nuts", quantity: 200 }, - { store: "General Store", item: "Pie", quantity: 100 }, - { store: "ShopMart", item: "Pie", quantity: 100 } - ] ) 
보고서 1: 연도별, 스토어 및 품목별 모든 판매량
다음 집계는 분기별 및 매장별 모든 매출을 나열하는 연간 매출 보고서를 생성합니다. 파이프라인은 $unionWith을 사용하여 모두의 컬렉션의 문서를 결합합니다.
db.sales_2017.aggregate( [    { $set: { _id: "2017" } },    { $unionWith: { coll: "sales_2018", pipeline: [ { $set: { _id: "2018" } } ] } },    { $unionWith: { coll: "sales_2019", pipeline: [ { $set: { _id: "2019" } } ] } },    { $unionWith: { coll: "sales_2020", pipeline: [ { $set: { _id: "2020" } } ] } },    { $sort: { _id: 1, store: 1, item: 1 } } ] ) 
특히 집계 파이프라인은 다음을 사용합니다.
- 연도를 포함하도록 - _id필드를 업데이트하는- $set단계.
- 4개의 컬렉션에서 모든 문서를 결합하는 일련의 - $unionWith단계로, 각 컬렉션은 해당 문서의- $set단계도 사용합니다.
- _id(연도),- store및- item를 기준으로 정렬하는- $sort단계.
파이프라인 출력:
{ "_id" : "2017", "store" : "General Store", "item" : "Chocolates", "quantity" : 150 } { "_id" : "2017", "store" : "General Store", "item" : "Cookies", "quantity" : 100 } { "_id" : "2017", "store" : "General Store", "item" : "Pie", "quantity" : 10 } { "_id" : "2017", "store" : "ShopMart", "item" : "Chocolates", "quantity" : 50 } { "_id" : "2017", "store" : "ShopMart", "item" : "Cookies", "quantity" : 120 } { "_id" : "2017", "store" : "ShopMart", "item" : "Pie", "quantity" : 5 } { "_id" : "2018", "store" : "General Store", "item" : "Cheese", "quantity" : 30 } { "_id" : "2018", "store" : "General Store", "item" : "Chocolates", "quantity" : 125 } { "_id" : "2018", "store" : "General Store", "item" : "Cookies", "quantity" : 200 } { "_id" : "2018", "store" : "General Store", "item" : "Pie", "quantity" : 30 } { "_id" : "2018", "store" : "ShopMart", "item" : "Cheese", "quantity" : 50 } { "_id" : "2018", "store" : "ShopMart", "item" : "Chocolates", "quantity" : 150 } { "_id" : "2018", "store" : "ShopMart", "item" : "Cookies", "quantity" : 100 } { "_id" : "2018", "store" : "ShopMart", "item" : "Nuts", "quantity" : 100 } { "_id" : "2018", "store" : "ShopMart", "item" : "Pie", "quantity" : 25 } { "_id" : "2019", "store" : "General Store", "item" : "Cheese", "quantity" : 50 } { "_id" : "2019", "store" : "General Store", "item" : "Chocolates", "quantity" : 125 } { "_id" : "2019", "store" : "General Store", "item" : "Cookies", "quantity" : 200 } { "_id" : "2019", "store" : "General Store", "item" : "Nuts", "quantity" : 80 } { "_id" : "2019", "store" : "General Store", "item" : "Pie", "quantity" : 50 } { "_id" : "2019", "store" : "ShopMart", "item" : "Cheese", "quantity" : 20 } { "_id" : "2019", "store" : "ShopMart", "item" : "Chocolates", "quantity" : 150 } { "_id" : "2019", "store" : "ShopMart", "item" : "Cookies", "quantity" : 100 } { "_id" : "2019", "store" : "ShopMart", "item" : "Nuts", "quantity" : 30 } { "_id" : "2019", "store" : "ShopMart", "item" : "Pie", "quantity" : 75 } { "_id" : "2020", "store" : "General Store", "item" : "Cheese", "quantity" : 100 } { "_id" : "2020", "store" : "General Store", "item" : "Chocolates", "quantity" : 200 } { "_id" : "2020", "store" : "General Store", "item" : "Cookies", "quantity" : 500 } { "_id" : "2020", "store" : "General Store", "item" : "Nuts", "quantity" : 100 } { "_id" : "2020", "store" : "General Store", "item" : "Pie", "quantity" : 100 } { "_id" : "2020", "store" : "ShopMart", "item" : "Cheese", "quantity" : 100 } { "_id" : "2020", "store" : "ShopMart", "item" : "Chocolates", "quantity" : 300 } { "_id" : "2020", "store" : "ShopMart", "item" : "Cookies", "quantity" : 400 } { "_id" : "2020", "store" : "ShopMart", "item" : "Nuts", "quantity" : 200 } { "_id" : "2020", "store" : "ShopMart", "item" : "Pie", "quantity" : 100 } 
보고서 2: 품목별 매출 애그리게이션
다음 집계는 항목당 판매 수량을 나열하는 판매 보고서를 만듭니다. 파이프라인은 $unionWith를 사용하여 4개 연도의 문서를 모두 결합합니다.
db.sales_2017.aggregate( [    { $unionWith: "sales_2018" },    { $unionWith: "sales_2019" },    { $unionWith: "sales_2020" },    { $group: { _id: "$item", total: { $sum: "$quantity" } } },    { $sort: { total: -1 } } ] ) 
- $unionWith단계의 시퀀스는 지정된 컬렉션에서 파이프라인으로 문서를 검색합니다.
- $group단계는- item필드를 기준으로 그룹화하고- $sum을(를) 사용하여- item당 총 판매 수량을 계산합니다.
- $sort단계에서는- total내림차순으로 문서를 정렬합니다.
파이프라인 출력:
{ "_id" : "Cookies", "total" : 1720 } { "_id" : "Chocolates", "total" : 1250 } { "_id" : "Nuts", "total" : 510 } { "_id" : "Pie", "total" : 395 } { "_id" : "Cheese", "total" : 350 } 
지정된 문서로 유니온 만들기
$unionWith를 사용하여 pipeline 필드에 지정한 문서와 유니온을 수행할 수 있습니다. pipeline 필드에 $documents 단계를 지정하면 별도의 컬렉션에 저장되지 않은 문서와의 유니온이 수행됩니다.
컬렉션 cakeFlavors을 만듭니다:
db.cakeFlavors.insertMany( [    { _id: 1, flavor: "chocolate" },    { _id: 2, flavor: "strawberry" },    { _id: 3, flavor: "cherry" } ] ) 
다음 $unionWith 작업은 pipeline $documents 필드에 지정된 문서와 유니온을 수행합니다.
db.cakeFlavors.aggregate( [    {       $unionWith: {          pipeline: [             {                $documents: [                   { _id: 4, flavor: "orange" },                   { _id: 5, flavor: "vanilla", price: 20 }                ]             }          ]       }    } ] ) 
출력:
[    { _id: 1, flavor: 'chocolate' },    { _id: 2, flavor: 'strawberry' },    { _id: 3, flavor: 'cherry' },    { _id: 4, flavor: 'orange' },    { _id: 5, flavor: 'vanilla', price: 20 } ] 
이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.
다음 Movie 클래스는 sample_mflix.movies 컬렉션의 문서를 모델링합니다.
public class Movie {     public ObjectId Id { get; set; }     public int Runtime { get; set; }          public string Title { get; set; }     public string Rated { get; set; }     public List<string> Genres { get; set; }     public string Plot { get; set; }          public ImdbData Imdb { get; set; }     public int Year { get; set; }     public int Index { get; set; }          public string[] Comments { get; set; }         []     public DateTime LastUpdated { get; set; } } 
참고
Pascal Case를 위한 ConventionPack
이 페이지의 C# 클래스는 속성 이름에 파스칼 표기법을 사용하지만, MongoDB 컬렉션의 필드 이름은 카멜 표기법을 사용합니다. 이 차이를 해결하기 위해 애플리케이션이 시작될 때 다음 코드를 사용하여 ConventionPack을 등록할 수 있습니다.
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 
MongoDB .NET/ C# 운전자 사용하여 $unionWith 집계 파이프라인 에 단계를  추가하려면 PipelineDefinition 객체 에서 UnionWith() 메서드를 호출합니다.
다음 예시 sample_mflix.movies 컬렉션 에서 수신 문서를 sample_mflix.Movies 컬렉션 의 Movie 문서와 결합하는 파이프라인 단계를 만듭니다.
var firstMovieCollection = client.GetDatabase("sample_mflix").GetCollection<Movie>("movies"); var secondMovieCollection = client.GetDatabase("sample_mflix").GetCollection<Movie>("Movies"); var pipeline = new EmptyPipelineDefinition<Movie>()     .UnionWith(         withCollection: secondMovieCollection,         withPipeline: new EmptyPipelineDefinition<Movie>()); var allMovieDocuments = firstMovieCollection.Aggregate(pipeline);  
이 페이지의 Node.js 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB Node.js 운전자 설명서에서 시작하기 를 참조하세요.
MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $unionWith 단계를 추가하려면 파이프라인 객체 에서 $unionWith 연산자 사용합니다.
다음 예시 sample_mflix.movies 컬렉션 에서 수신 문서를 sample_mflix.Movies 컬렉션 의 movie 문서와 결합하는 파이프라인 단계를 만듭니다. 그런 다음 이 예시 에서는 집계 파이프라인 실행합니다.
const db = client.db("sample_mflix"); const collection = db.collection("movies"); const pipeline = [{ $unionWith: { coll: "Movies" } }]; const cursor = collection.aggregate(pipeline); return cursor;