Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

$addFields (집계)

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 행동
  • 예시
$addFields

버전 3.4에 새로 추가되었습니다.

문서에 새 필드를 추가합니다. $addFields 입력 문서의 기존 필드와 새로 추가된 필드를 모두 포함하는 문서를 출력합니다.

$addFields 단계는 $project 입력 문서의 모든 기존 필드를 명시적으로 지정하고 새 필드를 추가하는 단계와 동일합니다.

참고

$addFields의 별칭인 $set 스테이지를 사용할 수도 있습니다.

다음 환경에서 호스팅되는 배포에 $addFields 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

$addFields 의 형식은 다음과 같습니다.

{ $addFields: { <newField>: <expression>, ... } }

추가할 각 필드의 이름을 지정하고 해당 값을 애그리게이션 표현식 에 설정합니다. 표현식에 대한 자세한 내용은 표현식을 참조하세요 .

중요

새 필드의 이름이 기존 필드 이름( _id 포함)과 동일한 경우 $addFields 해당 필드의 기존 값을 지정된 표현식의 값으로 덮어씁니다.

$addFields 기존 문서에 새 필드를 추가합니다. 집계 연산에 $addFields 단계를 1개 이상 포함시킬 수 있습니다.

내장된 문서(배열의 문서 포함)에 필드를 추가하려면 점 표기법을 사용합니다. 예제를 참조하세요.

$addFields를 사용하여 기존 배열 필드에 요소를 추가하려면 $concatArrays와 함께 사용하세요. 예시를 참조하세요.

컬렉션 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
}
] )

다음 작업은 두 개의 $addFields 단계를 사용하여 출력 문서에 세 개의 새 필드를 포함합니다.

db.scores.aggregate( [
{
$addFields: {
totalHomework: { $sum: "$homework" } ,
totalQuiz: { $sum: "$quiz" }
}
},
{
$addFields: { 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( [
{ $addFields: { "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" } }
]

$addFields 연산에서 기존 필드 이름을 지정하면 원래의 필드가 대체됩니다.

animals 컬렉션에는 다음 문서가 포함되어 있습니다.

db.animals.insertOne(
{ _id: 1, dogs: 10, cats: 15 }
)

다음 $addFields 연산은 cats 필드를 지정합니다.

db.animals.aggregate( [
{
$addFields: { cats: 20 }
}
] )

연산은 다음 문서를 반환합니다.

[ { _id: 1, dogs: 10, cats: 20 } ]

한 필드를 다른 필드로 바꿀 수 있습니다. 다음 예시에서는 item 필드가 _id 필드를 대체합니다.

컬렉션 fruit에는 다음 문서가 포함되어 있습니다.

db.fruit.insertMany( [
{ _id: 1, item: "tangerine", type: "citrus" },
{ _id: 2, item: "lemon", type: "citrus" },
{ _id: 3, item: "grapefruit", type: "citrus" }
] )

다음 집계 작업에서는 $addFields를 사용하여 각 문서의 _id 필드를 item 필드의 값으로 바꾸고, item 필드를 정적 값으로 바꿉니다.

db.fruit.aggregate( [
{
$addFields: {
_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 }
] )

$addFields$concatArrays 표현식과 함께 사용하여 기존 배열 필드에 요소를 추가할 수 있습니다. 예를 들어, 다음 작업은 $addFields를 사용하여 homework 필드를 현재 homework 배열과 새 점수 [ 7 ]이 포함된 다른 배열이 연결된 새 배열의 요소로 바꾸는 것입니다.

db.scores.aggregate( [
{ $match: { _id: 1 } },
{ $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
] )

이 연산은 다음을 반환합니다:

[ { _id: 1, student: "Maya", homework: [ 10, 5, 10, 7 ], quiz: [ 10, 8 ], extraCredit: 0 } ]

$addFields 변수를 $$REMOVE 변수와 함께 사용하여 문서 필드를 제거할 수 있습니다.

예를 들어 labReadings 컬렉션을 만듭니다.

db.labReadings.insertMany( [
{
date: ISODate("2024-10-09"),
temperature: 80
},
{
date: null,
temperature: 83
},
{
date: ISODate("2024-12-09"),
temperature: 85
}
] )

labReadings 문서에서 date 필드를 제거 하려면 $addFields$$REMOVE 변수와 함께 사용합니다.

db.labReadings.aggregate( [
{
$addFields: { date: "$$REMOVE" }
}
] )

출력:

[
{ _id: ObjectId('671285306fd2c3b24f2e7eaa'), temperature: 80 },
{ _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 },
{ _id: ObjectId('671285306fd2c3b24f2e7eac'), temperature: 85 }
]

$$REMOVE를 사용하여 필드를 조건부로 제거할 수도 있습니다. 예를 들어, 다음 집계는 datenull인 문서에서 date 필드를 제거합니다.

db.labReadings.aggregate( [
{
$addFields:
{
date: {
$ifNull: [ "$date", "$$REMOVE" ]
}
}
}
] )

출력:

[
{
_id: ObjectId('671285306fd2c3b24f2e7eaa'),
date: ISODate('2024-10-09T00:00:00.000Z'),
temperature: 80
},
{ _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 },
{
_id: ObjectId('671285306fd2c3b24f2e7eac'),
date: ISODate('2024-12-09T00:00:00.000Z'),
temperature: 85
}
]

$project와 비교

$addFields 또는 $project 단계를 사용하여 문서 필드를 제거할 수 있습니다. 파이프라인과 원본 문서를 얼마나 보존할 것인지에 따라 최적의 접근 방식이 달라질 수 있습니다.

$project 단계에서 $$REMOVE를 사용하는 예시는 조건부로 필드 제외를 참조하세요.

돌아가기

집계 파이프라인 단계

이 페이지의 내용