MongoDB 문서에서 $처럼 특수 문자가 포함된 문자열을 검색하려면 정규식(regular expression) 안에서 역슬래시(\)를 사용해 해당 특수 문자를 이스케이프 처리해야 합니다. 특수 문자를 이스케이프하지 않으면 정규식의 메타 문자로 해석되어 의도한 결과를 얻을 수 없습니다.
이 글에서는 실제 예제를 통해 특수 문자가 포함된 문자열을 검색하는 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 다음 쿼리를 실행하여 UserId 필드에 특수 문자 $가 포함된 문서들로 컬렉션을 생성합니다.
> db.searchDocumentWithSpecialCharactersDemo.insertOne({"UserId":"Smith$John123","UserFirstName":"John","UserLastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c987b98330fd0aa0d2fe4b1")
}
> db.searchDocumentWithSpecialCharactersDemo.insertOne({"UserId":"Taylor$Carol983","UserFirstName":"Carol","UserLastName":"Taylor"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c987bdb330fd0aa0d2fe4b2")
}
> db.searchDocumentWithSpecialCharactersDemo.insertOne({"UserId":"Doe$John999","UserFirstName":"John","UserLastName":"Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c987bee330fd0aa0d2fe4b3")
}
> db.searchDocumentWithSpecialCharactersDemo.insertOne({"UserId":"Miller$David555","UserFirstName":"David","UserLastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c987c01330fd0aa0d2fe4b4")
}2. 저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다. 가독성을 높이기 위해 pretty()를 함께 사용했습니다.
> db.searchDocumentWithSpecialCharactersDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
{
"_id" : ObjectId("5c987b98330fd0aa0d2fe4b1"),
"UserId" : "Smith$John123",
"UserFirstName" : "John",
"UserLastName" : "Smith"
}
{
"_id" : ObjectId("5c987bdb330fd0aa0d2fe4b2"),
"UserId" : "Taylor$Carol983",
"UserFirstName" : "Carol",
"UserLastName" : "Taylor"
}
{
"_id" : ObjectId("5c987bee330fd0aa0d2fe4b3"),
"UserId" : "Doe$John999",
"UserFirstName" : "John",
"UserLastName" : "Doe"
}
{
"_id" : ObjectId("5c987c01330fd0aa0d2fe4b4"),
"UserId" : "Miller$David555",
"UserFirstName" : "David",
"UserLastName" : "Miller"
}3. 특수 문자를 포함한 문자열 검색 쿼리 실행
이제 본격적으로 특수 문자가 포함된 문자열을 검색해 보겠습니다. 아래 쿼리는 UserId 필드에서 특수 문자 $ 뒤에 John이 오는 문자열을 찾는 예제입니다. 핵심은 $ 앞에 역슬래시(\$)를 붙여 이스케이프 처리하는 것입니다.
> db.searchDocumentWithSpecialCharactersDemo.find({ UserId : /.*\$John.*/i }).pretty();쿼리 실행 결과는 다음과 같습니다. UserId에 $John이 포함된 두 개의 문서만 정확히 반환된 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5c987b98330fd0aa0d2fe4b1"),
"UserId" : "Smith$John123",
"UserFirstName" : "John",
"UserLastName" : "Smith"
}
{
"_id" : ObjectId("5c987bee330fd0aa0d2fe4b3"),
"UserId" : "Doe$John999",
"UserFirstName" : "John",
"UserLastName" : "Doe"
}정리
MongoDB에서 특수 문자가 포함된 문자열을 검색할 때 기억해야 할 핵심 사항은 다음과 같습니다.
- 정규식에서 특별한 의미를 가지는 메타 문자($, ., *, + 등)를 일반 문자로 취급하려면 반드시 역슬래시(\)로 이스케이프해야 합니다.
- 패턴 끝에 붙인 i 옵션은 대소문자를 구분하지 않고 검색하도록 설정합니다.
- /.*패턴.*/ 형태를 사용하면 해당 패턴이 문자열 어디에 위치하더라도 매칭됩니다.