MongoDB에서 배열 내부의 특정 값을 다른 값으로 교체하려면 $set 연산자와 위치 연산자($)를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 배열 요소를 업데이트하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 학생 점수 배열을 가진 두 개의 문서를 삽입합니다.
> db.replaceValueInArrayDemo.insertOne({"StudentScores":[45,56,78]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7f0421a844af18acdffb7")
}
> db.replaceValueInArrayDemo.insertOne({"StudentScores":[33,90,67]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7f0521a844af18acdffb8")
}2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.replaceValueInArrayDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd7f0421a844af18acdffb7"),
"StudentScores" : [
45,
56,
78
]
}
{
"_id" : ObjectId("5cd7f0521a844af18acdffb8"),
"StudentScores" : [
33,
90,
67
]
}3. $set으로 배열 값 교체하기
이제 첫 번째 문서의 StudentScores 배열에서 값 45를 99로 변경해 보겠습니다. 핵심은 쿼리 조건에 일치하는 배열 요소를 가리키는 위치 연산자 $를 활용하는 것입니다.
> db.replaceValueInArrayDemo.update({_id: ObjectId("5cd7f0421a844af18acdffb7"), StudentScores:45}, {$set: {'StudentScores.$': 99}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과 nModified가 1로 표시되며, 하나의 문서가 성공적으로 수정되었음을 확인할 수 있습니다.
동작 원리
- 쿼리 조건부: _id와 함께
StudentScores: 45조건을 지정하여 변경 대상이 되는 배열 요소를 찾습니다. - $set 연산자:
'StudentScores.$'필드 경로에서$는 쿼리 조건과 일치한 첫 번째 배열 요소의 위치를 나타냅니다. - 주의 사항: 쿼리 조건에 해당 배열 값을 포함하지 않으면 위치 연산자를 사용할 수 없으므로 반드시 함께 작성해야 합니다.
4. 변경 결과 확인하기
문서를 다시 한번 조회하여 값이 정상적으로 교체되었는지 확인합니다.
> db.replaceValueInArrayDemo.find().pretty();
출력 결과를 보면 첫 번째 문서의 배열 첫 번째 요소가 45에서 99로 변경된 것을 알 수 있습니다.
{
"_id" : ObjectId("5cd7f0421a844af18acdffb7"),
"StudentScores" : [
99,
56,
78
]
}
{
"_id" : ObjectId("5cd7f0521a844af18acdffb8"),
"StudentScores" : [
33,
90,
67
]
}마무리
이처럼 MongoDB에서는 $set 연산자와 위치 연산자 $를 조합하면 배열 내 특정 값을 간단하게 교체할 수 있습니다. 참고로 MongoDB 4.2 이상에서는 updateOne() 메서드 사용이 권장되며, 여러 개의 일치하는 요소를 모두 변경하고 싶다면 all positional operator인 $[] 또는 filtered positional operator인 $[identifier]를 활용하는 것도 좋은 방법입니다.