MongoDB 문자열 비교 개요
MongoDB에서 두 문자열을 비교해야 할 때는 $strcasecmp 연산자를 사용하면 됩니다. 이 연산자는 두 문자열을 대소문자를 구분하지 않고(case-insensitive) 비교하며, 그 결과로 다음 세 가지 값 중 하나를 반환합니다.
- 1 : 첫 번째 문자열이 두 번째 문자열보다 “큰” 경우
- 0 : 두 문자열이 같은 경우
- -1 : 첫 번째 문자열이 두 번째 문자열보다 “작은” 경우
그럼 실제 예제를 통해 $strcasecmp의 동작 방식을 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 테스트용 문서들을 담은 컬렉션을 생성합니다.
> db.demo490.insertOne({"Name1":"John","Name2":"john"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8496ccb0f3fa88e22790bb")
}
> db.demo490.insertOne({"Name1":"David","Name2":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8496d9b0f3fa88e22790bc")
}
> db.demo490.insertOne({"Name1":"Carol","Name2":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8496e5b0f3fa88e22790bd")
}위 코드는 총 세 개의 문서를 삽입합니다. 각 문서는 비교할 두 개의 필드(Name1, Name2)를 가지고 있습니다.
2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo490.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e8496ccb0f3fa88e22790bb"), "Name1" : "John", "Name2" : "john" }
{ "_id" : ObjectId("5e8496d9b0f3fa88e22790bc"), "Name1" : "David", "Name2" : "Bob" }
{ "_id" : ObjectId("5e8496e5b0f3fa88e22790bd"), "Name1" : "Carol", "Name2" : "Carol" }3. $strcasecmp로 문자열 비교 실행
이제 애그리게이션 파이프라인의 $project 단계에서 $strcasecmp 연산자를 적용하여 두 필드를 비교합니다.
> db.demo490.aggregate(
... [
... {
... $project:
... {
... Name1: 1,
... Name2: 1,
... Result: { $strcasecmp: [ "$Name1", "$Name2" ] }
... }
... }
... ]
... )
쿼리 실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e8496ccb0f3fa88e22790bb"), "Name1" : "John", "Name2" : "john", "Result" : 0 }
{ "_id" : ObjectId("5e8496d9b0f3fa88e22790bc"), "Name1" : "David", "Name2" : "Bob", "Result" : 1 }
{ "_id" : ObjectId("5e8496e5b0f3fa88e22790bd"), "Name1" : "Carol", "Name2" : "Carol", "Result" : 0 }결과 분석
- John vs john → 결과값 0: 대소문자가 달라도 같은 문자열로 판단됩니다.
- David vs Bob → 결과값 1: 사전순으로 “David”가 “Bob”보다 뒤에 오므로(더 크므로) 1을 반환합니다.
- Carol vs Carol → 결과값 0: 완전히 동일한 문자열입니다.
이처럼 $strcasecmp는 대소문자 차이를 무시하고 문자열의 순서만 비교하기 때문에, 이름 검색 정규화나 데이터 중복 검사 등 다양한 상황에서 유용하게 활용할 수 있습니다.