MongoDB의 $push 연산자는 기존 배열에 새로운 요소를 추가할 때 사용되며, 중첩 배열(nested array)에도 동일하게 적용할 수 있습니다. 이 글에서는 중첩 배열 구조를 가진 문서에 $push를 활용해 새로운 하위 문서를 추가하는 과정을 단계별로 살펴보겠습니다.
1. 중첩 배열 문서가 포함된 컬렉션 생성
$push 개념을 이해하기 위해 먼저 중첩 배열을 포함한 문서로 컬렉션을 생성하겠습니다. 아래 쿼리는 직원 정보 안에 프로젝트 배열이 중첩된 구조의 문서를 삽입합니다.
>db.nestedArrayDemo.insertOne({"EmployeeName":"Larry","EmployeeSalary":9000,"EmployeeDetails":
[{"EmployeeDOB":new Date('1990-01-21'),"EmployeeDepartment":"ComputerScience","EmployeeProject":
[{"Technology":"C","Duration":6},{"Technology":"Java","Duration":7}]}]});실행 결과는 다음과 같습니다.
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d73090c3d5054b766a76e")
}2. find() 메서드로 문서 조회하기
컬렉션이 정상적으로 생성되었는지 확인하기 위해 find() 메서드로 저장된 문서를 조회해 보겠습니다.
> db.nestedArrayDemo.find().pretty();
조회 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6d73090c3d5054b766a76e"),
"EmployeeName" : "Larry",
"EmployeeSalary" : 9000,
"EmployeeDetails" : [
{
"EmployeeDOB" : ISODate("1990-01-21T00:00:00Z"),
"EmployeeDepartment" : "ComputerScience",
"EmployeeProject" : [
{
"Technology" : "C",
"Duration" : 6
},
{
"Technology" : "Java",
"Duration" : 7
}
]
}
]
}현재 EmployeeDetails 배열 안에 ComputerScience 부서 정보가 있고, 그 안의 EmployeeProject 배열에는 C(6개월)와 Java(7개월) 프로젝트 두 개가 들어 있는 것을 확인할 수 있습니다.
3. $push로 중첩 배열에 새 문서 추가하기
이제 $push 연산자를 사용해 중첩된 EmployeeProject 배열에 새로운 프로젝트 문서를 추가해 보겠습니다. 위치 연산자 $를 활용하면 조건에 일치하는 특정 배열 요소를 정확히 지정할 수 있습니다.
>db.nestedArrayDemo.update({"_id":ObjectId("5c6d73090c3d5054b766a76e"),
"EmployeeDetails.EmployeeDepartment":"ComputerScience"}, {"$push":
{"EmployeeDetails.$.EmployeeProject": {"Technology":"Python", "Duration":4 }}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })위 쿼리에서는 조건으로 부서명이 "ComputerScience"인 요소를 찾은 뒤, 해당 요소의 EmployeeProject 배열에 {"Technology":"Python", "Duration":4} 문서를 추가했습니다. 실행 결과 nModified 값이 1로 표시되므로 문서가 성공적으로 수정되었음을 알 수 있습니다.
4. 업데이트 결과 확인
변경 사항이 제대로 반영되었는지 다시 한번 문서를 조회해 보겠습니다.
> db.nestedArrayDemo.find().pretty();
최종 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6d73090c3d5054b766a76e"),
"EmployeeName" : "Larry",
"EmployeeSalary" : 9000,
"EmployeeDetails" : [
{
"EmployeeDOB" : ISODate("1990-01-21T00:00:00Z"),
"EmployeeDepartment" : "ComputerScience",
"EmployeeProject" : [
{
"Technology" : "C",
"Duration" : 6
},
{
"Technology" : "Java",
"Duration" : 7
},
{
"Technology" : "Python",
"Duration" : 4
}
]
}
]
}결과를 보면 EmployeeProject 배열 끝에 Python 프로젝트(기간 4개월)가 새롭게 추가된 것을 확인할 수 있습니다. 이처럼 MongoDB에서는 update 쿼리와 $push 연산자, 그리고 위치 연산자($)를 조합하면 중첩 배열의 원하는 위치에 손쉽게 새로운 문서를 추가할 수 있습니다.