Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB 중첩 배열에서 $push 연산자로 새 문서 추가하는 방법

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 연산자, 그리고 위치 연산자($)를 조합하면 중첩 배열의 원하는 위치에 손쉽게 새로운 문서를 추가할 수 있습니다.