HOME > webdevetc

[NodeJS] mongodb find() 검색 쿼리시 대소문자 구분하지 않는 방법

마지막 수정일 : 2022-07-16 / 생성일 : 2022-07-14
309
View Count
NodeJS에서 MongoDB를 사용하여 검색 쿼리를 작성하였는데 특수문자가 포함되어 검색 결과가 원하는데로 나타나지 않았습니다. 이 경우 해결 방법에 대하여 알아봅니다.


# NodeJS 서버 특수문자를 사용한 검색 방법
MongoDB에서 검색 쿼리 작성 후 이상없이 동작하였으나 특수문자가 포함된 경우에만 에러가 발생하였습니다. 예를들어 아래와 같은 문자열이 포함된 쿼리문을 작성하고자 합니다.


@ 검색 대상의 필드 title의 텍스트
title: 'abc def [ghi] jlk mn'

위 텍스트에서 아래와 같은 특수문자가 포함된 텍스트를 검색해봅니다. 검색할 텍스트가 어디에 위치해 있을지 모르므로 정규표현식을 사용하려고 합니다. 정규표현식을 사용하면 위치와 상관없이 검색어를 찾을 수 있죠.
const query = {
  title: { $regex: /[ghi]/ }
}
db.collection.find(query)

실행해보면 찾지 못하고 null 값을 반환합니다. 즉 특수문자가 포함된 경우에는 동작하지 않는군요... 해결하기 위해서 여러가지 테스트를 해보았으나 생각처럼 쉽게 해결되지 않더군요 ~ 꽤 오랜시간 뒤에 해결 방법을 찾을 수 있었습니다.

일단 아래와 같은 쿼리문은 모두 실패하였습니다.
title: { $regex: /\[ghi\]/ }

title: { $regex: new Regexp('\[ghi\]') }

역슬래쉬인 \ 기호를 넣으면 될 것이라 생각했지만 동작하지 않았습니다. 정규표현식으로 new Regex를 써보면 달라질까 생각해봤지만 결과는 역시 동일했습니다.

해결 방법부터 알아보면 역슬래쉬를 하나가 아닌 두 개를 사용하는 방법이었습니다. 즉 성공한 쿼리문은 아래와 같습니다.
title: { $regex: /\\[ghi\\]/ }

이와 같이 해결할 수 있어 다행입니다. 쿼리문을 작성하면서 여러가지 이슈들이 있었는데 관련된 내용을 아래에 적어볼께요!


! 정규표현식에서 대소문자 무시하는 쿼리문 작성, ignore case
new Regex에서 대소문자 쿼리문은 i 플래그를 추가하면 되죠. 간단합니다. 그런데 g 글로벌 값과 같이 사용하려면 어떻게 할까요? 아래에서 선택해보세요.

(1) title: { $regex: new Regexp('\[ghi\]'), $options: 'ig' }
(2) title: { $regex: new Regexp('\[ghi\]'), $options:  [ 'i', 'g' ] }

먼저 옵션에는 배열을 사용할 수 없습니다. 즉 2번은 제외하고 1번입니다.


여기까지 Node환경의 MongoDB 정규표현식 검색 쿼리와 관련하여 간략하게 알아보았습니다.
Author ByEnSSo