MongoDB 중첩 배열에 새 항목 추가하기
MongoDB에서 문서 내부의 중첩 배열(nested array)에 새 항목을 추가하려면 find() 메서드와 update() 메서드를 함께 활용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다.
> db.demo124.insertOne(
... {
... "Name" : "John",
... "Id" : 101,
... "ProjectDetails" : [{
... "ProjectName1" : "Online Book",
... "ProjectName2" : "Online Banking"
... }, {
... "ProjectName1" : "Online Library Management System",
... "ProjectName2" : "School Management System"
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2f2c8b140daf4c2a3544bb")
}위 예제에서는 'John'이라는 사용자 정보와 함께 두 개의 프로젝트 세부 정보(ProjectDetails)를 담고 있는 중첩 배열이 포함된 문서를 생성했습니다.
2. 삽입된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo124.find();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e2f2c8b140daf4c2a3544bb"), "Name" : "John", "Id" : 101, "ProjectDetails" : [
{ "ProjectName1" : "Online Book", "ProjectName2" : "Online Banking" },
{ "ProjectName1" : "Online Library Management System", "ProjectName2" : "School Management System" }
]
}3. 중첩 배열에 새 항목 추가하는 쿼리
이제 forEach() 반복문과 update() 메서드를 조합하여 중첩 배열의 각 요소에 새 필드를 추가하는 쿼리를 실행합니다.
> db.demo124.find().toArray().forEach(
... function(d){
... for(var i = 0; i< d.ProjectDetails.length; ++i) {
... d.ProjectDetails[i]['ProjectName3'] = 'Online Snake Game';
... }
... db.demo124.update({_id: d._id}, d);
... }
... );위 쿼리의 동작 원리는 다음과 같습니다.
- toArray(): find() 결과를 배열로 변환하여 자바스크립트에서 순회할 수 있게 합니다.
- forEach(): 각 문서마다 콜백 함수를 실행합니다.
- for 반복문: ProjectDetails 배열의 모든 요소를 순회하며 'ProjectName3' 키에 'Online Snake Game' 값을 추가합니다.
- update(): 변경된 문서를 _id를 기준으로 데이터베이스에 다시 저장합니다.
4. 업데이트 결과 확인
업데이트 후 find().pretty() 메서드로 문서를 다시 조회해 보겠습니다.
> db.demo124.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e2f2c8b140daf4c2a3544bb"),
"Name" : "John",
"Id" : 101,
"ProjectDetails" : [
{
"ProjectName1" : "Online Book",
"ProjectName2" : "Online Banking",
"ProjectName3" : "Online Snake Game"
},
{
"ProjectName1" : "Online Library Management System",
"ProjectName2" : "School Management System",
"ProjectName3" : "Online Snake Game"
}
]
}마무리
출력 결과를 보면 중첩 배열인 ProjectDetails의 모든 요소에 'ProjectName3' : 'Online Snake Game' 항목이 성공적으로 추가된 것을 확인할 수 있습니다. 이처럼 find()와 update()를 조합한 자바스크립트 반복 처리 방식을 활용하면 MongoDB에서 중첩 배열 구조를 유연하게 수정할 수 있습니다.
참고로, 최신 MongoDB 버전에서는 update() 대신 updateOne() 또는 updateMany() 사용이 권장되며, $set 연산자와 위치 연산자($[], $[])를 활용하면 더욱 효율적인 배열 업데이트가 가능합니다.