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

MongoDB에서 $push 연산자로 하위 문서를 계속 추가하는 방법

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 연산자를 사용하는 것이 좋습니다.