MongoDB에서 배열 내 특정 조건과 일치하는 요소를 찾아 새로운 값을 추가하려면 update 명령어와 $push 연산자, 그리고 위치 연산자($)를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 학생 정보를 담은 demo9 컬렉션을 만들어 보겠습니다.
> db.demo9.insertOne({"StudentDetails":[{"StudentName":"Chris","ListOfSubject":["MySQL","Java"]}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0f6438d7df943a7cec4f94")
}
2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo9.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e0f6438d7df943a7cec4f94"),
"StudentDetails" : [
{
"StudentName" : "Chris",
"ListOfSubject" : [
"MySQL",
"Java"
]
}
]
}
3. $push와 위치 연산자로 배열 요소 업데이트하기
이제 조건과 일치하는 배열 요소를 업데이트해 보겠습니다. 쿼리의 필터 부분에서 일치하는 요소의 위치를 지정하는 $(위치 연산자)를 사용하고, $push로 새 값을 추가합니다.
> db.demo9.update( { "StudentDetails.StudentName":"Chris"}, {$push:{"StudentDetails.$.ListOfSubject":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
여기서 핵심은 StudentDetails.$.ListOfSubject 부분입니다. $는 쿼리 조건(StudentName: "Chris")과 일치한 첫 번째 배열 요소를 가리키며, 해당 요소의 ListOfSubject 배열에 "MongoDB"가 추가됩니다.
4. 업데이트 결과 확인하기
다시 find() 메서드로 문서를 조회해 변경 사항을 확인합니다.
> db.demo9.find().pretty();
업데이트된 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e0f6438d7df943a7cec4f94"),
"StudentDetails" : [
{
"StudentName" : "Chris",
"ListOfSubject" : [
"MySQL",
"Java",
"MongoDB"
]
}
]
}
정리
MongoDB에서 중첩 배열의 특정 요소를 수정할 때는 다음 세 가지가 핵심입니다.
- $push: 배열 끝에 새 값을 추가하는 연산자
- 위치 연산자($): 쿼리 조건과 일치한 첫 번째 배열 요소를 참조
- update / updateOne: 조건에 맞는 문서를 갱신하는 명령어
참고로 최신 MongoDB 버전에서는 update() 대신 updateOne() 또는 updateMany() 사용이 권장됩니다. 또한 여러 개의 일치하는 요소를 동시에 수정해야 한다면 $[](all positional operator)나 arrayFilters 옵션을 활용할 수 있습니다.