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

MongoDB에서 $push 연산자로 배열 업데이트하기

MongoDB에서 $push 연산자를 사용해 배열을 업데이트하려면 updateOne() 메서드를 활용하면 됩니다. 이 글에서는 컬렉션을 생성하고, 조건에 맞는 문서의 배열 요소에 새 데이터를 추가하는 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 insertOne() 메서드를 사용해 데모용 컬렉션에 문서를 생성합니다.

> db.demo526.insertOne(
... {
...     "CountryName": "US",
...     "TeacherName": "Bob",
...     "StudentInformation": [
...         {
...             "Name": "Chris",
...             "Subject": "MySQL",
...             "ListOfMailId": []
...         },
...         {
...             "Name": "David",
...             "Subject": "MongoDB",
...             "ListOfMailId": []
...         }
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8af031437efc8605595b6b")
}

2. 생성된 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo526.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e8af031437efc8605595b6b"), "CountryName" : "US", "TeacherName" :
"Bob", "StudentInformation" : [ { "Name" : "Chris", "Subject" : "MySQL", "ListOfMailId" : [ ] }, {
"Name" : "David", "Subject" : "MongoDB", "ListOfMailId" : [ ] } ] }

3. $push와 $elemMatch로 배열 업데이트

이제 $push 연산자를 사용해 특정 학생의 메일 목록에 새 메일 주소를 추가해 보겠습니다. 여기서 핵심은 $elemMatch를 사용해 업데이트할 배열 요소를 정확히 찾아내고, 위치 연산자 $를 통해 해당 요소만 수정하는 것입니다.

> db.demo526.updateOne(
... {
...     _id: ObjectId("5e8af031437efc8605595b6b"),
...     "StudentInformation": { "$elemMatch": { "Name": "David", "Subject": "MongoDB" }}
... },
... {
...     "$push": { "StudentInformation.$.ListOfMailId": { "MailId": "David@gmail.com" }}
... }
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

쿼리 실행 결과 matchedCountmodifiedCount가 각각 1로 반환되며, 이는 하나의 문서가 성공적으로 매칭되고 수정되었음을 의미합니다.

4. 업데이트 결과 확인

다시 find() 메서드로 전체 문서를 조회해 변경 사항을 확인합니다.

> db.demo526.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e8af031437efc8605595b6b"), "CountryName" : "US", "TeacherName" : "Bob", "StudentInformation" : [
    { "Name" : "Chris", "Subject" : "MySQL", "ListOfMailId" : [ ] },
    { "Name" : "David", "Subject" : "MongoDB", "ListOfMailId" : [ { "MailId" : "David@gmail.com" } ] }
] }

정리

이 예제에서 확인했듯이, David의 ListOfMailId 배열에만 새 메일 주소가 추가되었고 Chris의 데이터는 그대로 유지되었습니다. 이처럼 $push$elemMatch, 그리고 위치 연산자 $를 함께 사용하면 중첩 배열 내부의 특정 요소만 정확하게 업데이트할 수 있습니다. 복잡한 중첩 구조의 문서를 다룰 때 매우 유용한 패턴이므로 꼭 기억해 두시기 바랍니다.