MongoDB에서 저장된 문자열 데이터의 대소문자를 통일해야 하는 경우가 자주 있습니다. 예를 들어 학생 이름이 'JOHN SMith', 'CAROL TAYLor'처럼 대소문자가 뒤섞여 저장되어 있다면, forEach 루프와 JavaScript의 toLowerCase() 메서드를 조합하여 모든 문서를 한 번에 소문자로 변환할 수 있습니다.
1. 테스트용 컬렉션 생성
먼저 StudentName 필드를 가진 문서들을 포함하는 컬렉션을 생성해 보겠습니다.
> db.lowerCaseDemo.insertOne({"StudentName":"JOHN SMith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd9a86fb50a6c6dd317ad9f")
}
> db.lowerCaseDemo.insertOne({"StudentName":"CAROL TAYLor"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd9a88fb50a6c6dd317ada0")
}
> db.lowerCaseDemo.insertOne({"StudentName":"DAVID Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd9a89fb50a6c6dd317ada1")
}2. 현재 저장된 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.lowerCaseDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5cd9a86fb50a6c6dd317ad9f"),
"StudentName" : "JOHN SMith"
}
{
"_id" : ObjectId("5cd9a88fb50a6c6dd317ada0"),
"StudentName" : "CAROL TAYLor"
}
{
"_id" : ObjectId("5cd9a89fb50a6c6dd317ada1"),
"StudentName" : "DAVID Miller"
}보시는 것처럼 각 문서의 이름 필드에 대문자와 소문자가 혼재되어 있는 상태입니다.
3. forEach 루프로 toLowerCase() 적용하기
이제 핵심 단계입니다. find()로 StudentName 필드가 존재하는 문서만 조회한 뒤, forEach()로 각 문서를 순회하면서 toLowerCase()를 적용하고 save()로 다시 저장합니다.
> db.lowerCaseDemo.find({StudentName: { $exists: true}}).forEach(
function(v) {
v.StudentName = v.StudentName.toLowerCase();
db.lowerCaseDemo.save(v);
}
);쿼리 동작 원리:
{StudentName: { $exists: true}}조건으로 해당 필드가 실제로 존재하는 문서만 대상으로 제한합니다. 이렇게 하면 필드가 없는 문서에서 오류가 발생하는 것을 방지할 수 있습니다.- forEach() 내부의 함수는 조회된 각 문서를 인자(v)로 전달받습니다.
- v.StudentName.toLowerCase()로 이름 값을 소문자로 변환한 후, save() 메서드로 기존 문서를 덮어씁니다.
4. 업데이트 결과 확인
변환이 완료되었으므로 모든 문서를 다시 한번 조회해 보겠습니다.
> db.lowerCaseDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd9a86fb50a6c6dd317ad9f"),
"StudentName" : "john smith"
}
{
"_id" : ObjectId("5cd9a88fb50a6c6dd317ada0"),
"StudentName" : "carol taylor"
}
{
"_id" : ObjectId("5cd9a89fb50a6c6dd317ada1"),
"StudentName" : "david miller"
}모든 StudentName 값이 성공적으로 소문자로 변환된 것을 확인할 수 있습니다.
참고 사항
대량의 데이터를 다룰 때는 save() 대신 updateOne() 또는 bulkWrite()를 사용하는 것이 성능 면에서 더 유리합니다. 또한 MongoDB 4.2 이상에서는 집계 파이프라인 기반 업데이트($toLower 연산자)를 활용하면 서버 측에서 한 번의 연산으로 처리할 수도 있습니다.