Aggregation 을 사용한 출력 필드 재구성
필드 이름 변경 또는 새 계산 필드 생성과 같은 더 고급 변환의 경우 find() 메서드의 프로젝션만으로는 충분하지 않습니다. 대신 집계 프레임워크, 특히 $project 단계를 사용할 수 있습니다.
이 단계를 위해 데이터를 준비해 보겠습니다. 컬렉션을 삭제하고 급여 정보가 있는 사용자를 삽입합니다.
db.users.deleteMany({});
db.users.insertMany([
{
name: "John Doe",
age: 30,
salary: 75000,
department: "Engineering"
},
{
name: "Jane Smith",
age: 28,
salary: 85000,
department: "Data Science"
},
{
name: "Mike Johnson",
age: 35,
salary: 95000,
department: "Management"
}
]);
집계 파이프라인의 $project 단계는 새 필드를 추가하거나, 기존 필드 이름을 변경하거나, 필드를 제거하여 문서를 재구성할 수 있습니다. 사용하려면 스테이지 배열을 aggregate() 메서드에 전달합니다.
필드 이름을 변경하려면 새 필드 이름을 정의하고 기존 필드 값 앞에 $ 기호를 붙여 할당합니다. name을 fullName으로, age를 yearsOld로 변경해 보겠습니다.
db.users.aggregate([
{
$project: {
fullName: "$name",
yearsOld: "$age",
_id: 0
}
}
]);
계산을 기반으로 새 필드를 만들 수도 있습니다. 연간 salary를 12 로 나누어 monthlySalary 필드를 만들고, $switch 연산자를 사용하여 조건부 논리를 기반으로 salaryTier 필드를 만들어 보겠습니다.
db.users.aggregate([
{
$project: {
name: 1,
monthlySalary: { $divide: ["$salary", 12] },
salaryTier: {
$switch: {
branches: [
{ case: { $lt: ["$salary", 80000] }, then: "Junior" },
{ case: { $gte: ["$salary", 80000] }, then: "Senior" }
],
default: "Unknown"
}
},
_id: 0
}
}
]);
출력은 $project 단계에서 정의한 완전히 새로운 문서 구조가 됩니다.
[
{ "name": "John Doe", "monthlySalary": 6250, "salaryTier": "Junior" },
{
"name": "Jane Smith",
"monthlySalary": 7083.333333333333,
"salaryTier": "Senior"
},
{
"name": "Mike Johnson",
"monthlySalary": 7916.666666666667,
"salaryTier": "Senior"
}
]
$project 단계는 쿼리 결과의 최종 구조에 대한 완전한 제어를 제공하여 데이터베이스 내에서 직접 강력한 데이터 변환을 가능하게 합니다.