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 }쿼리 실행 결과 matchedCount와 modifiedCount가 각각 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, 그리고 위치 연산자 $를 함께 사용하면 중첩 배열 내부의 특정 요소만 정확하게 업데이트할 수 있습니다. 복잡한 중첩 구조의 문서를 다룰 때 매우 유용한 패턴이므로 꼭 기억해 두시기 바랍니다.