MongoDB 문서에 저장된 문자열 값 중 일부(부분 문자열)를 다른 문자열로 바꾸고 싶다면 replace() 함수를 사용하면 됩니다. replace()는 JavaScript의 기본 문자열 메서드로, MongoDB 셸에서 find().forEach()와 함께 조합하면 컬렉션 내 문서들의 필드 값을 간편하게 수정할 수 있습니다.
실제 동작 과정을 이해하기 위해 예제 컬렉션을 하나 만들어 단계별로 살펴보겠습니다.
1. 예제 컬렉션 생성 및 문서 삽입
먼저 오타가 포함된 URL을 가진 문서를 삽입합니다. 아래 쿼리는 'replaceSubstringDemo'라는 컬렉션을 생성하고 문서를 추가합니다.
> db.replaceSubstringDemo.insertOne({"WebsiteURL":"www.gogle.com"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c76eaf21e9c5dd6f1f78276")
}2. 삽입된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다. pretty()를 붙이면 결과가 보기 좋게 정렬되어 출력됩니다.
> db.replaceSubstringDemo.find().pretty();
출력 결과
{
"_id" : ObjectId("5c76eaf21e9c5dd6f1f78276"),
"WebsiteURL" : "www.gogle.com"
}'gogle'이라는 오타가 그대로 저장된 것을 확인할 수 있습니다. 이제 이 부분 문자열을 교체해 보겠습니다.
3. replace() 함수로 부분 문자열 교체하기
아래 쿼리는 조건에 일치하는 문서를 찾아 순회하면서, JavaScript의 replace() 함수로 잘못된 URL을 올바른 URL로 변경한 뒤 save()로 다시 저장하는 방식입니다.
> db.replaceSubstringDemo.find({WebsiteURL:"www.gogle.com"}).forEach(function(url,k){
... url.WebsiteURL=url.WebsiteURL.replace("www.gogle.com","www.google.com");
... db.replaceSubstringDemo.save(url)
... });동작 원리를 정리하면 다음과 같습니다.
- find(조건): WebsiteURL이 'www.gogle.com'인 문서만 조회합니다.
- forEach(): 조회된 각 문서에 대해 반복 작업을 수행합니다.
- replace(기존값, 변경값): 필드 값에서 'www.gogle.com'을 'www.google.com'으로 치환합니다.
- save(url): 수정된 문서를 원래 _id를 유지한 채 다시 저장합니다.
4. 교체 결과 검증하기
문서가 실제로 수정되었는지 다시 한번 조회해 확인해 보겠습니다.
> db.replaceSubstringDemo.find().pretty();
출력 결과
{
"_id" : ObjectId("5c76eaf21e9c5dd6f1f78276"),
"WebsiteURL" : "www.google.com"
}출력 결과를 보면 'www.gogle.com'이 'www.google.com'으로 성공적으로 교체된 것을 확인할 수 있습니다.
참고: 대량 데이터 처리 시 주의사항
forEach + save 방식은 소규모 데이터에는 충분하지만, 문서 수가 많다면 성능상 비효율적일 수 있습니다. 이 경우 집계 파이프라인의 $replaceOne 연산자나 updateMany()를 활용하면 서버 측에서 한 번에 처리할 수 있어 더 효율적입니다. 또한 save() 대신 updateOne({ _id: url._id }, { $set: { WebsiteURL: url.WebsiteURL } }) 형태로 업데이트하는 것이 안전합니다.