MongoDB에서 하위 문서를 계속 추가하는 방법
MongoDB에서 배열 형태의 필드에 하위 문서(subdocument)를 계속해서 추가하려면 $push 연산자를 사용하면 됩니다. 기존 문서를 수정할 때는 update() 메서드를 함께 활용합니다. 아래 예제를 통해 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용하여 컬렉션을 생성하고 문서를 삽입합니다.
> db.demo587.insertOne({"id":101,"details":[{Name:"Chris",Age:21,Marks:57}]});
{
"acknowledged" : true, "insertedId" : ObjectId("5e92ba01fd2d90c177b5bcc9")
}
> db.demo587.insertOne({"id":102,"details":[{Name:"Bob",Age:22,Marks:78}]});
{
"acknowledged" : true, "insertedId" : ObjectId("5e92ba0efd2d90c177b5bcca")
}2단계: find() 메서드로 전체 문서 조회
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo587.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e92ba01fd2d90c177b5bcc9"), "id" : 101, "details" : [ { "Name" : "Chris", "Age" : 21, "Marks" : 57 } ] }
{ "_id" : ObjectId("5e92ba0efd2d90c177b5bcca"), "id" : 102, "details" : [ { "Name" : "Bob", "Age" : 22, "Marks" : 78 } ] } 3단계: $push 연산자로 하위 문서 추가
이제 update() 메서드와 $push 연산자를 조합하여 id가 101인 문서의 details 배열에 새로운 하위 문서를 추가합니다.
> db.demo587.update({"id":101}, {"$push": {"details":{Subject:"MongoDB"}}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과 nModified가 1로 표시되며, 이는 하나의 문서가 성공적으로 수정되었음을 의미합니다.
4단계: 결과 확인
다시 find() 메서드로 전체 문서를 조회하여 변경 사항을 확인합니다.
> db.demo587.find();
출력 결과를 보면 id가 101인 문서의 details 배열 끝에 { Subject: "MongoDB" } 하위 문서가 정상적으로 추가된 것을 알 수 있습니다.
{ "_id" : ObjectId("5e92ba01fd2d90c177b5bcc9"), "id" : 101, "details" : [
{ "Name" : "Chris", "Age" : 21, "Marks" : 57 }, { "Subject" : "MongoDB" }
] }
{ "_id" : ObjectId("5e92ba0efd2d90c177b5bcca"), "id" : 102, "details" : [
{ "Name" : "Bob", "Age" : 22, "Marks" : 78 }
] }참고 사항
최신 MongoDB 버전(4.x 이상)에서는 update() 메서드가 deprecated 상태이므로, 실무 환경에서는 동일한 기능을 수행하는 updateOne() 또는 updateMany() 사용을 권장합니다. 예를 들어 위 작업은 다음과 같이 작성할 수 있습니다.
> db.demo587.updateOne({"id":101}, {"$push": {"details":{Subject:"MongoDB"}}});또한 $push 연산자는 배열에 요소를 추가할 때 중복 검사를 수행하지 않으므로, 중복 값을 방지하고 싶다면 $addToSet 연산자를 사용하는 것이 좋습니다.