MongoDB에서 이미 생성된 객체 내부의 배열에 새 항목을 추가하려면 $push 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 중첩된 구조의 배열에 데이터를 삽입하는 과정을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 details1 객체 안에 details2와 details3이라는 두 개의 배열이 중첩되어 있는 구조입니다.
> db.demo449.insertOne(
... {
... details1: {
... details2: [{
... _id:new ObjectId(),
... Name:"Chris"
... }],
... details3: [{
... _id:new ObjectId(),
... Name:"David"
... }]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e7a40e971f552a0ebb0a6e3")
}2. 문서 조회하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo449.find();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5e7a40e971f552a0ebb0a6e3"), "details1" : { "details2" : [ { "_id" :
ObjectId("5e7a40e971f552a0ebb0a6e1"), "Name" : "Chris" } ], "details3" : [ { "_id" :
ObjectId("5e7a40e971f552a0ebb0a6e2"), "Name" : "David" } ] } }3. 객체 내부의 배열에 항목 삽입하기
이제 객체 내부에 있는 배열(details1.details2)에 새 항목을 삽입하는 쿼리를 살펴보겠습니다. update() 메서드와 함께 $push 연산자를 사용하고, 점 표기법(dot notation)으로 배열의 경로를 지정하는 것이 핵심입니다.
> db.demo449.update({_id:ObjectId("5e7a40e971f552a0ebb0a6e3")}, {$push: {
'details1.details2':{_id:ObjectId(),"Name":"Carol"}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }실행 결과 nModified 값이 1로 반환되었으므로, 문서가 성공적으로 수정되었음을 알 수 있습니다.
4. 최종 결과 확인
수정이 완료되었다면 find() 메서드로 다시 한번 문서를 조회하여 변경 사항을 확인해 보겠습니다.
> db.demo449.find();
출력 결과를 보면 details2 배열에 Name이 "Carol"인 새 항목이 정상적으로 추가된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e7a40e971f552a0ebb0a6e3"), "details1" : { "details2" : [ { "_id" :
ObjectId("5e7a40e971f552a0ebb0a6e1"), "Name" : "Chris" }, { "_id" :
ObjectId("5e7a41a671f552a0ebb0a6e5"), "Name" : "Carol" } ], "details3" : [ { "_id" :
ObjectId("5e7a40e971f552a0ebb0a6e2"), "Name" : "David" } ] } }정리
MongoDB에서 객체 내부에 중첩된 배열에 항목을 추가할 때는 $push 연산자와 점 표기법('details1.details2' 형식)을 조합하여 사용하면 됩니다. 참고로 최신 버전의 MongoDB에서는 update() 대신 updateOne() 또는 updateMany() 메서드를 사용하는 것이 권장됩니다.