MongoDB에서 배열의 단일 값을 문자열로 바꾸기
MongoDB에서 배열 내부의 특정 값을 다른 문자열로 교체하려면 $set 연산자와 함께 위치 연산자($)를 사용하면 됩니다. 위치 연산자는 쿼리 조건과 일치하는 첫 번째 배열 요소를 자동으로 식별해 주므로, 인덱스를 직접 지정하지 않고도 원하는 값을 손쉽게 수정할 수 있습니다.
먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.demo564.insertOne({"StudentName":["Chris","David","Mike","Sam"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e90880a39cfeaaf0b97b576")
}삽입된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo564.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e90880a39cfeaaf0b97b576"),
"StudentName" : [
"Chris",
"David",
"Mike",
"Sam"
]
}배열 값 교체 쿼리 실행
이제 "David"라는 배열 요소를 "Carol Taylor"라는 문자열로 교체해 보겠습니다. updateMany() 메서드 안에서 조건으로 해당 값을 찾고, $set과 위치 연산자($)를 조합해 일치하는 요소만 새 값으로 덮어씁니다.
> db.demo564.updateMany(
... { "StudentName": "David" },
... { "$set": { "StudentName.$": "Carol Taylor" } }
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
실행 결과 matchedCount와 modifiedCount가 각각 1로 표시되며, 이는 하나의 문서가 성공적으로 업데이트되었음을 의미합니다.
업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회해 변경 사항을 확인해 보겠습니다.
> db.demo564.find().pretty();
출력 결과를 보면 "David"가 "Carol Taylor"로 정상적으로 교체된 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5e90880a39cfeaaf0b97b576"),
"StudentName" : [
"Chris",
"Carol Taylor",
"Mike",
"Sam"
]
}정리
이처럼 MongoDB에서는 { "필드명.$": 새로운값 } 형태의 $set 구문을 사용하면 배열 내 일치하는 첫 번째 요소만 선택적으로 교체할 수 있습니다. 참고로 여러 개의 일치 항목을 모두 수정해야 하는 경우에는 arrayFilters 옵션을 활용하는 것이 좋습니다.