Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 forEach 루프로 toLowerCase()를 활용해 학생 이름을 소문자로 일괄 업데이트하는 방법

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 연산자)를 활용하면 서버 측에서 한 번의 연산으로 처리할 수도 있습니다.