정의
$set문서에 새 필드를 추가합니다.
$set입력 문서의 기존 필드와 새로 추가된 필드를 모두 포함하는 문서를 출력합니다.$set단계는$addFields의 별칭입니다.두 단계 모두 입력 문서의 모든 기존 필드를 명시적으로 지정하고 새 필드를 추가하는
$project단계와 동일합니다.
호환성
다음 환경에서 호스팅되는 배포에 $set 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
$set 의 형식은 다음과 같습니다.
{ $set: { <newField>: <expression>, ... } }
추가할 각 필드의 이름을 지정하고 해당 값을 집계 표현식 또는 빈 객체에 설정하다. 표현식에 대한 자세한 내용은 표현식을 참조하세요.
중요
새 필드의 이름이 기존 필드 이름( _id 포함)과 동일한 경우 $set 해당 필드의 기존 값을 지정된 표현식의 값으로 덮어씁니다.
행동
$set는 기존 문서에 새 필드를 추가합니다. 집계 연산에 하나 이상의$set단계를 포함할 수 있습니다.$set집계 표현식이나 빈 객체에 값을 설정할 수 있는 객체 포함을 허용합니다. 예를 들어 다음과 같은 중첩 객체가 허용됩니다:{$set: { a: { b: { } } } } 내장된 문서(배열의 문서 포함)에 필드를 추가하려면 점 표기법을 사용합니다. 예시를 참조하십시오 .
$set를 사용하여 기존 배열 필드에 요소를 추가하려면$concatArrays와 함께 사용하세요. 예시를 참조하세요.
예시
이 페이지의 예시에서는 sample_mflix 샘플 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB 배포서버에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예시를 실행 하려면 데이터베이스를 제거하고 다시 만들어야 할 수 있습니다.
두 개의 $set 단계 사용
다음 작업은 두 개의 $set 단계를 사용하여 출력 문서에 세 개의 새 필드를 포함합니다.
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { imdbScoreScaled: { $multiply: [ "$imdb.rating", 10 ] }, runtimeHours: { $floor: { $divide: [ "$runtime", 60 ] } } } }, { $set: { totalScore: { $add: [ "$imdbScoreScaled", "$runtimeHours" ] } } } ] )
[ { _id: ..., title: 'Baseball', runtime: 1140, imdbScoreScaled: 91, runtimeHours: 19, totalScore: 110 }, { _id: ..., title: 'Centennial', runtime: 1256, imdbScoreScaled: 85, runtimeHours: 20, totalScore: 105 } ] ...
내장된 문서에 필드 추가
점 표기법을 사용하여 내장된 문서에 새 필드를 추가할 수 있습니다.
다음 집계 작업은 내장된 문서 imdb에 새 필드 normalizedRating 을 추가합니다.
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { "imdb.normalizedRating": { $multiply: [ "$imdb.rating", 10 ] } } } ] )
[ { _id: ..., title: 'Baseball', imdb: { '...': '...', normalizedRating: 91 } }, { _id: ..., title: 'Centennial', imdb: { '...': '...', normalizedRating: 85 } } ] ...
기존 필드 덮어쓰기
$set 작업에서 기존 필드 이름을 지정하면 원래 필드가 대체됩니다.
다음 $set 작업은 rated 필드를 재정의합니다.
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { rated: "UNRATED" } } ] )
[ { _id: ..., title: 'Baseball', rated: 'UNRATED' } ] ...
한 필드 다른 필드로 바꿀 수 있습니다. 다음 예시 에서는 title 필드 _id 필드 대체합니다.
다음 집계 작업은 $set 을 사용하여 각 문서 의 _id 필드 title 필드 값으로 바꾸고 title 필드 문자열 "movie"로 바꿉니다.
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { _id: "$title", title: "movie" } } ] )
[ { _id: 'Baseball', title: 'movie' }, { _id: 'Centennial', title: 'movie' } ] ...
배열에 요소 추가
$set $concatArrays 을 표현식 과 함께 사용하여 기존 배열 필드 에 요소를 추가할 수 있습니다. 다음 작업은 을 $set 사용하여 genres 필드 현재 genres 배열 과 새 장르 를 포함하는 다른 배열 이 연결된 새 배열 로 [ "Classic" ] 바꿉니다.
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { genres: { $concatArrays: [ "$genres", [ "Classic" ] ] } } } ] )
[ { _id: ..., title: 'Baseball', genres: [ 'Documentary', 'History', 'Sport', 'Classic' ] } ] ...
기존 필드로 새 필드 만들기
다음 집계 작업은 영화 제목을 출시하다 연도와 연결하는 새 필드 titleWithYear 를 각 문서 에 추가합니다.
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { titleWithYear: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] } } } ] )
[ { _id: ..., title: 'Baseball', titleWithYear: 'Baseball (1994)' }, { _id: ..., title: 'Centennial', titleWithYear: 'Centennial (1978)' } ] ...
이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.
다음 Movie 클래스는 sample_mflix.movies 컬렉션의 문서를 모델링합니다.
[] public class Movie { [] public ObjectId Id { get; set; } [] public string Title { get; set; } = null!; [] public int? Year { get; set; } [] public int? Runtime { get; set; } [] public string? Rated { get; set; } [] public int Metacritic { get; set; } [] public string? Plot { get; set; } [] public string? Type { get; set; } [] public string[]? Cast { get; set; } [] public string[]? Directors { get; set; } [] public string[]? Writers { get; set; } [] public ImdbData? Imdb { get; set; } }
MongoDB .NET/ C# 운전자 사용하여 $set 집계 파이프라인 에 단계를 추가하려면 PipelineDefinition 객체 에서 Set() 메서드를 호출합니다.
다음 예시는 제목이 "The Godfather" 인 Movie 문서와 일치하고 Rated 필드를 "UNRATED"으로 설정하는 파이프라인 단계를 만듭니다.
var pipeline = new EmptyPipelineDefinition<Movie>() .Match(Builders<Movie>.Filter.Eq(m => m.Title, "The Godfather")) .Set(Builders<Movie>.SetFields.Set(m => m.Rated, "UNRATED"));
{ "_id" : "...", "title" : "The Godfather", "runtime" : 175, "rated" : "UNRATED", "metacritic" : 100 }
이 페이지의 Node.js 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB Node.js 운전자 설명서에서 시작하기 를 참조하세요.
MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $set 단계를 추가하려면 파이프라인 객체 에서 $set 연산자 사용합니다.
다음 예시에서는 각 movie 문서의 lastupdated 필드 값을 Date 객체의 값으로 설정하는 파이프라인 단계를 만듭니다. 그리고 집계 파이프라인을 실행합니다.
const pipeline = [{ $set: { lastupdated: new Date() } }]; const cursor = collection.aggregate(pipeline); return cursor;
자세히 알아보기
관련 파이프라인 단계에 대해 자세히 학습 $addFields 가이드 참조하세요.