정의
- $replaceWith
- 입력 문서를 지정된 문서로 교체합니다. 이 작업은 - _id필드를 포함하여 입력 문서의 모든 기존 필드를 대체합니다.- $replaceWith를 사용하면 내장된 문서를 최상위 수준으로 승격할 수 있습니다. 새 문서를 대체 문서로 지정할 수도 있습니다.- $replaceWith단계는- $replaceRoot단계와 동일한 조치를 수행하지만 단계의 형태가 다릅니다.- $replaceWith단계의 형식은 다음과 같습니다.- { $replaceWith: <replacementDocument> } - 대체 문서는 문서로 해석되는 모든 유효한 표현식 일 수 있습니다. 표현식에 대한 자세한 내용은 표현식을 참조하세요 . 
행동
<replacementDocument>가 문서가 아닌 경우 $replaceWith 오류가 발생하여 실패합니다.
<replacementDocument>가 누락된 문서(즉, 문서가 존재하지 않음)로 확인되면 $replaceWith 오류가 발생하고 실패합니다. 예를 들어, 다음 문서를 사용하여 컬렉션을 만듭니다.
db.collection.insertMany([    { "_id": 1, "name" : { "first" : "John", "last" : "Backus" } },    { "_id": 2, "name" : { "first" : "John", "last" : "McCarthy" } },    { "_id": 3, "name": { "first" : "Grace", "last" : "Hopper" } },    { "_id": 4, "firstname": "Ole-Johan", "lastname" : "Dahl" }, ]) 
그러면 문서 중 하나에 name 필드가 없기 때문에 다음 $replaceWith 작업이 실패합니다.
db.collection.aggregate([    { $replaceWith: "$name" } ]) 
오류를 방지하려면 $mergeObjects를 사용해 name 문서를 일부 기본 문서와 병합하면 됩니다. 그 예는 다음과 같습니다.
db.collection.aggregate([    { $replaceWith: { $mergeObjects: [ { _id: "$_id", first: "", last: "" }, "$name" ] } } ]) 
또한, $match 단계를 포함해 $replaceWith 단계로 문서를 전달하기 전에 문서 필드의 존재 여부를 확인하여 name 필드가 누락된 문서를 건너뛸 수 있습니다.
db.collection.aggregate([    { $match: { name : { $exists: true, $not: { $type: "array" }, $type: "object" } } },    { $replaceWith: "$name" } ]) 
또는 $ifNull 표현식을 사용하여 다른 문서를 루트로 지정할 수 있습니다. 예시:
db.collection.aggregate([    { $replaceWith: { $ifNull: [ "$name", { _id: "$_id", missingName: true} ] } } ]) 
예시
$replaceWith 내장된 문서 필드
다음 문서를 사용하여 people 라는 이름의 샘플 collection을 생성합니다.
db.people.insertMany([    { "_id" : 1, "name" : "Arlene", "age" : 34, "pets" : { "dogs" : 2, "cats" : 1 } },    { "_id" : 2, "name" : "Sam", "age" : 41, "pets" : { "cats" : 1, "fish" : 3 } },    { "_id" : 3, "name" : "Maria", "age" : 25 } ]) 
다음 작업은 $replaceWith 단계를 사용하여 각 입력 문서를 $mergeObjects 작업의 결과로 바꿉니다. $mergeObjects 표현식은 지정된 기본 문서를 pets 문서와 병합합니다.
db.people.aggregate( [    { $replaceWith: { $mergeObjects:  [ { dogs: 0, cats: 0, birds: 0, fish: 0 }, "$pets" ] } } ] ) 
이 연산은 다음과 같은 결과를 반환합니다.
{ "dogs" : 2, "cats" : 1, "birds" : 0, "fish" : 0 } { "dogs" : 0, "cats" : 1, "birds" : 0, "fish" : 3 } { "dogs" : 0, "cats" : 0, "birds" : 0, "fish" : 0 } 
$replaceWith 배열에 중첩된 문서
students라는 이름의 컬렉션에 다음 문서가 포함되어 있습니다.
db.students.insertMany([    {       "_id" : 1,       "grades" : [          { "test": 1, "grade" : 80, "mean" : 75, "std" : 6 },          { "test": 2, "grade" : 85, "mean" : 90, "std" : 4 },          { "test": 3, "grade" : 95, "mean" : 85, "std" : 6 }       ]    },    {       "_id" : 2,       "grades" : [          { "test": 1, "grade" : 90, "mean" : 75, "std" : 6 },          { "test": 2, "grade" : 87, "mean" : 90, "std" : 3 },          { "test": 3, "grade" : 91, "mean" : 85, "std" : 4 }       ]    } ]) 
다음 작업은 grade 필드가 90보다 크거나 같은 내장된 문서를 최상위 수준으로 승격합니다.
db.students.aggregate( [    { $unwind: "$grades" },    { $match: { "grades.grade" : { $gte: 90 } } },    { $replaceWith: "$grades" } ] ) 
이 연산은 다음과 같은 결과를 반환합니다.
{ "test" : 3, "grade" : 95, "mean" : 85, "std" : 6 } { "test" : 1, "grade" : 90, "mean" : 75, "std" : 6 } { "test" : 3, "grade" : 91, "mean" : 85, "std" : 4 } 
$replaceWith 새로 생성된 문서
예시 1
예시 collection sales은(는) 다음 문서로 채워집니다.
db.sales.insertMany([    { "_id" : 1, "item" : "butter", "price" : 10, "quantity": 2, date: ISODate("2019-03-01T08:00:00Z"), status: "C" },    { "_id" : 2, "item" : "cream", "price" : 20, "quantity": 1, date: ISODate("2019-03-01T09:00:00Z"), status: "A" },    { "_id" : 3, "item" : "jam", "price" : 5, "quantity": 10, date: ISODate("2019-03-15T09:00:00Z"), status: "C" },    { "_id" : 4, "item" : "muffins", "price" : 5, "quantity": 10, date: ISODate("2019-03-15T09:00:00Z"), status: "C" } ]) 
보고서를 만들기 위해 현재 보고서 실행 시간을 기준으로 완료된 각각의 판매에 대한 총액을 계산한다고 가정해 보겠습니다. 다음 연산은 $replaceWith 단계를 사용해 C 상태인 모든 판매를 찾아 새 문서를 생성합니다. $replaceWith는 총 금액을 계산하고 변수 NOW를 사용하여 현재 시간을 가져옵니다.
db.sales.aggregate([    { $match: { status: "C" } },    { $replaceWith: { _id: "$_id", item: "$item", amount: { $multiply: [ "$price", "$quantity"]}, status: "Complete", asofDate: "$$NOW" } } ]) 
이 작업은 다음 문서를 반환합니다.
{ "_id" : 1, "item" : "butter", "amount" : 20, "status" : "Complete", "asofDate" : ISODate("2019-06-03T22:47:54.812Z") } { "_id" : 3, "item" : "jam", "amount" : 50, "status" : "Complete", "asofDate" : ISODate("2019-06-03T22:47:54.812Z") } { "_id" : 4, "item" : "muffins", "amount" : 50, "status" : "Complete", "asofDate" : ISODate("2019-06-03T22:47:54.812Z") } 
예시 2
예시 컬렉션 reportedsales는 분기 및 리전별로 보고된 판매 정보로 채워집니다.
db.reportedsales.insertMany( [    { _id: 1, quarter: "2019Q1", region: "A", qty: 400 },    { _id: 2, quarter: "2019Q1", region: "B", qty: 550 },    { _id: 3, quarter: "2019Q1", region: "C", qty: 1000 },    { _id: 4, quarter: "2019Q2", region: "A", qty: 660 },    { _id: 5, quarter: "2019Q2", region: "B", qty: 500 },    { _id: 6, quarter: "2019Q2", region: "C", qty: 1200 } ] ) 
보고 목적으로 보고된 판매 데이터를 분기별로 조회려고 한다고 가정합니다. 예를 들어
{ "_id" : "2019Q1", "A" : 400, "B" : 550, "C" : 1000 } 
분기별로 그룹화된 데이터를 보려면 다음 집계 파이프라인을 사용할 수 있습니다.
db.reportedsales.aggregate( [    { $addFields: { obj:  { k: "$region", v: "$qty" } } },    { $group: { _id: "$quarter", items: { $push: "$obj" } } },    { $project: { items2: { $concatArrays: [ [ { "k": "_id", "v": "$_id" } ], "$items" ] } } },    { $replaceWith: { $arrayToObject: "$items2" } } ] ) 
- 첫 번째 단계:
- $addFields단계에서는 키- k를 리전 값으로, 값- v를 해당 리전의 수량으로 정의하는 새- obj문서 필드를 추가합니다. 예시:- { "_id" : 1, "quarter" : "2019Q1", "region" : "A", "qty" : 400, "obj" : { "k" : "A", "v" : 400 } } 
- 두 번째 단계:
- $group단계는 분기별로 그룹화하고- $push을(를) 사용하여- obj필드를 새- items배열 필드로 누적합니다. 예시:- { "_id" : "2019Q1", "items" : [ { "k" : "A", "v" : 400 }, { "k" : "B", "v" : 550 }, { "k" : "C", "v" : 1000 } ] } 
- 세 번째 단계:
- $project단계에서는- $concatArrays를 사용하여- _id정보와- items배열의 요소를 포함하는 새 배열- items2를 만듭니다.- { "_id" : "2019Q1", "items2" : [ { "k" : "_id", "v" : "2019Q1" }, { "k" : "A", "v" : 400 }, { "k" : "B", "v" : 550 }, { "k" : "C", "v" : 1000 } ] } 
- 네 번째 단계:
- $replaceWith는- $arrayToObject를 사용하여- items2를 지정된 키- k와 값- v쌍을 사용하며, 해당 문서를 다음 단계로 출력합니다. 예를 들면 다음과 같습니다.- { "_id" : "2019Q1", "A" : 400, "B" : 550, "C" : 1000 } 
집계는 다음 문서를 반환합니다.
{ "_id" : "2019Q1", "A" : 400, "B" : 550, "C" : 1000 } { "_id" : "2019Q2", "A" : 660, "B" : 500, "C" : 1200 } 
$replaceWith $$ROOT에서 생성된 새 문서 및 기본 문서
다음 문서를 사용하여 contacts 라는 이름의 샘플 collection을 생성합니다.
db.contacts.insertMany( [    { "_id" : 1, name: "Fred", email: "fred@example.net" },    { "_id" : 2, name: "Frank N. Stine", cell: "012-345-9999" },    { "_id" : 3, name: "Gren Dell", cell: "987-654-3210", email: "beo@example.net" } ] ) 
다음 연산은 $replaceWith와 $mergeObjects를 사용하여 누락된 필드에 대한 기본값이 있는 현재 문서를 출력합니다.
db.contacts.aggregate( [    { $replaceWith:       { $mergeObjects:          [             { _id: "", name: "", email: "", cell: "", home: "" },             "$$ROOT"          ]       }    } ] ) 
집계는 다음 문서를 반환합니다.
{   _id: 1,   name: 'Fred',   email: 'fred@example.net',   cell: '',   home: '' }, {   _id: 2,   name: 'Frank N. Stine',   email: '',   cell: '012-345-9999',   home: '' }, {   _id: 3,   name: 'Gren Dell',   email: 'beo@example.net',   cell: '',   home: '987-654-3210' } 
이 페이지의 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); 
다음 클래스는 ImdbData 문서를 모델링합니다.
public class ImdbData {     public string Id { get; set; }     public int Votes { get; set; }     public float Rating { get; set; } } 
MongoDB .NET/ C# 운전자 사용하여 $replaceWith 집계 파이프라인 에 단계를  추가하려면 PipelineDefinition 객체 에서 ReplaceWith() 메서드를 호출합니다.
다음 예시 각 입력 Movie 문서 Imdb 속성 에 저장된 ImdbData 문서 로 대체하는 파이프라인 단계를 만듭니다.
var pipeline = new EmptyPipelineDefinition<Movie>()     .ReplaceWith(m => m.ImdbData); 
이 페이지의 Node.js 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB Node.js 운전자 설명서에서 시작하기 를 참조하세요.
MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $replaceWith 단계를 추가하려면 파이프라인 객체 에서 $replaceWith 연산자 사용합니다.
다음 예시 각 입력 movie 문서 imdb 필드 에 저장된 문서 로 대체하는 파이프라인 단계를 만듭니다. 그런 다음 이 예시 에서는 집계 파이프라인 실행합니다.
const pipeline = [{ $replaceWith: { replacement: "$imdb" } }]; const cursor = collection.aggregate(pipeline); return cursor; 
자세히 알아보기
관련 파이프라인 단계에 대해 자세히 학습 $replaceRoot 가이드 참조하세요.