HOME > webdevetc

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

Last Modified : 2022-07-16 / Created : 2022-07-14
1,416
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 정규표현식 검색 쿼리와 관련하여 간략하게 알아보았습니다.

Previous

Post thumbnail Apache2 permission error 해결하기

Next

nginx 서버에서 특정 호스트만 연결 설정 방법, specific host only Post thumbnail