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

MongoDB에서 객체 내부의 배열에 항목을 삽입하는 방법 ($push 연산자 활용)

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() 메서드를 사용하는 것이 권장됩니다.