MongoDB 문서의 배열 안에 새로운 요소(필드)를 추가하려면 위치 연산자($)를 update() 메서드와 함께 사용하면 됩니다. 위치 연산자는 쿼리 조건과 일치하는 배열 요소를 자동으로 식별해 주기 때문에, 인덱스 번호를 직접 지정하지 않고도 해당 요소만 정확하게 수정할 수 있습니다.
아래 예제를 통해 실제 동작 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 샘플 컬렉션을 만들고 문서를 삽입합니다.
> db.demo222.insertOne({"details":[{"StudentName":"Chris","StudentMarks":78},{"StudentName":"David","StudentMarks":89}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ee31703d395bdc213472f")
}2단계: 문서 확인
find() 메서드로 컬렉션의 모든 문서를 조회합니다.
> db.demo222.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e3ee31703d395bdc213472f"),
"details" : [
{
"StudentName" : "Chris",
"StudentMarks" : 78
},
{
"StudentName" : "David",
"StudentMarks" : 89
}
]
}3단계: 위치 연산자($)로 새 필드 추가
이제 update() 메서드와 $ 연산자를 사용해 특정 학생의 배열 요소에 새로운 필드를 추가합니다.
> db.demo222.update({"details.StudentName" : "Chris"},{"$set" : {"details.$.SubjectName":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })여기서 "details.$"는 쿼리 조건(StudentName이 "Chris")과 일치하는 배열 요소를 가리킵니다. 따라서 Chris 항목에만 SubjectName 필드가 새롭게 추가되고, 나머지 요소는 그대로 유지됩니다.
4단계: 업데이트 결과 확인
다시 find() 메서드로 변경된 문서를 확인합니다.
> db.demo222.find().pretty();
결과를 보면 StudentName이 "Chris"인 요소에만 SubjectName 필드가 추가된 것을 알 수 있습니다.
{
"_id" : ObjectId("5e3ee31703d395bdc213472f"),
"details" : [
{
"StudentName" : "Chris",
"StudentMarks" : 78,
"SubjectName" : "MongoDB"
},
{
"StudentName" : "David",
"StudentMarks" : 89
}
]
}추가 참고 사항
최신 MongoDB 버전(4.2 이상)에서는 update() 대신 updateOne(), updateMany() 메서드 사용이 권장됩니다. 또한 여러 배열 요소를 한 번에 수정해야 하는 경우에는 전체 위치 연산자($[])나 arrayFilters 옵션을 활용하면 더욱 유연한 업데이트가 가능합니다.