$set (집계)
정의
$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
와 함께 사용하세요. 예시를 참조하세요.
예시
두 개의 $set
단계사용
다음을 사용하여 샘플 scores
컬렉션을 만듭니다:
db.scores.insertMany( [ { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 }, { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 } ] )
다음 작업은 두 개의 $set
단계를 사용하여 출력 문서에 세 개의 새 필드를 포함합니다.
db.scores.aggregate( [ { $set: { totalHomework: { $sum: "$homework" }, totalQuiz: { $sum: "$quiz" } } }, { $set: { totalScore: { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } } } ] )
이 작업은 다음 문서를 반환합니다.
[ { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0, totalHomework: 25, totalQuiz: 18, totalScore: 43 }, { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8, totalHomework: 16, totalQuiz: 16, totalScore: 40 } ]
내장된 문서에 필드 추가
점 표기법을 사용하여 내장된 문서에 새 필드를 추가할 수 있습니다.
다음을 사용하여 vehicles
샘플 컬렉션을 생성합니다.
db.vehicles.insertMany( [ { _id: 1, type: "car", specs: { doors: 4, wheels: 4 } }, { _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2 } }, { _id: 3, type: "jet ski" } ] )
다음 집계 작업은 내장된 문서 specs
에 새 필드 fuel_type
를 추가합니다.
db.vehicles.aggregate( [ { $set: { "specs.fuel_type": "unleaded" } } ] )
이 연산은 다음과 같은 결과를 반환합니다.
[ { _id: 1, type: "car", specs: { doors: 4, wheels: 4, fuel_type: "unleaded" } }, { _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2, fuel_type: "unleaded" } }, { _id: 3, type: "jet ski", specs: { fuel_type: "unleaded" } } ]
기존 필드 덮어쓰기
$set
작업에서 기존 필드 이름을 지정하면 원래 필드가 대체됩니다.
다음을 사용하여 animals
라는 샘플 collection을 생성합니다.
db.animals.insertOne( { _id: 1, dogs: 10, cats: 15 } )
다음 $set
작업은 cats
필드를 재정의합니다.
db.animals.aggregate( [ { $set: { cats: 20 } } ] )
연산은 다음 문서를 반환합니다.
[ { _id: 1, dogs: 10, cats: 20 } ]
한 필드를 다른 필드로 바꿀 수 있습니다. 다음 예시에서는 item
필드가 _id
필드를 대체합니다.
다음 문서가 포함된 fruits
라는 샘플 컬렉션을 만듭니다.
db.fruits.insertMany( [ { _id: 1, item: "tangerine", type: "citrus" }, { _id: 2, item: "lemon", type: "citrus" }, { _id: 3, item: "grapefruit", type: "citrus" } ] )
다음 애그리게이션 작업에서는 $set
을(를) 사용하여 각 문서의 _id
필드를 item
필드 값으로 바꾸고, item
필드를 문자열 "fruit"
(으)로 바꿉니다.
db.fruits.aggregate( [ { $set: { _id: "$item", item: "fruit" } } ] )
이 연산은 다음을 반환합니다:
[ { _id: "tangerine", item: "fruit", type: "citrus" }, { _id: "lemon", item: "fruit", type: "citrus" }, { _id: "grapefruit", item: "fruit", type: "citrus" } ]
배열에 요소 추가
다음을 사용하여 샘플 scores
컬렉션을 만듭니다:
db.scores.insertMany( [ { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 }, { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 } ] )
$set
를 $concatArrays
표현식과 함께 사용하여 기존 배열 필드에 요소를 추가할 수 있습니다. 예를 들어, 다음 작업은 $set
를 사용하여 homework
필드를 현재 homework
배열과 새 점수 [ 7 ]
이 포함된 다른 배열이 연결된 새 배열의 요소로 바꾸는 것입니다.
db.scores.aggregate( [ { $match: { _id: 1 } }, { $set: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } } ] )
이 연산은 다음을 반환합니다:
[ { _id: 1, student: "Maya", homework: [ 10, 5, 10, 7 ], quiz: [ 10, 8 ], extraCredit: 0 } ]
기존 필드로 새 필드 만들기
다음을 사용하여 샘플 scores
컬렉션을 만듭니다:
db.scores.insertMany( [ { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 }, { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 } ] )
다음 집계 연산은 quiz
배열의 평균을 포함하는 각 문서에 새 필드 quizAverage
를 추가합니다.
db.scores.aggregate( [ { $set: { quizAverage: { $avg: "$quiz" } } } ] )
이 작업은 다음 문서를 반환합니다.
[ { _id: 1, student: 'Maya', homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0, quizAverage: 9 }, { _id: 2, student: 'Ryan', homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8, quizAverage: 8 } ]