MongoDB - 정규 표현식

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 MongoDB에서 정규 표현식의 fascinatig 세계로 뛰어들어 볼 거예요. 프로그래밍에 처음이라도 걱정 마세요 - 저는 수년 동안 수많은 학생들을 가르치면서 이 여정을 단계별로 안내해 왔습니다. 이제 이 모험을 함께 시작해 보세요!

MongoDB - Regular Expression

정규 표현식이란?

먼저 MongoDB의 구체적인 내용에 들어가기 전에 정규 표현식(Regex)이 무엇인지 이해해 보겠습니다. 상상해 보세요, 대량의 텍스트 속에서 특정 패턴을 찾는 탐정이 되는 것. 바로 이게 Regex가 하는 일입니다 - 문자열 속에서 패턴을 검색하는 데 도움을 줍니다. 멋지죠?

MongoDB에서 regex 표현식 사용하기

MongoDB에서는 regex를 사용하여 쿼리에서 패턴 일치를 수행합니다. 데이터베이스에 대한 초능력 같은东西을 가지게 되는 것입니다!

간단한 예제로 시작해 보겠습니다. 가정해 봅시다, 책의 컬렉션이 있고, 제목이 "The"로 시작하는 모든 책을 찾고 싶다면 어떻게 하죠.

db.books.find({ title: /^The/ })

이 쿼리에서:

  • db.books은 우리의 컬렉션입니다.
  • find()은 검색에 사용되는 메서드입니다.
  • title은 검색할 필드입니다.
  • /^The/은 우리의 regex 패턴입니다.

^ 기호는 "시작합니다"라는 의미입니다. 따라서 이 쿼리는 제목이 "The"로 시작하는 모든 문서를 찾습니다.

이를 더 자세히 설명하면:

// 이것은 일치합니다:
"The Great Gatsby"
"The Catcher in the Rye"

// 이것은 일치하지 않습니다:
"Catch-22"
"To Kill a Mockingbird"

대소문자 구분없는 regex 표현식 사용하기

이제 "the"로 시작하는 책을 찾지만, 대문자나 소문자에 상관없이 찾고 싶다면 어떻게 하죠? 우리는 regex를 대소문자 구분없이 만들 수 있습니다!

db.books.find({ title: /^the/i })

regex의 끝에 i를 추가하면 대소문자 구분없이 일치하게 됩니다. 이제 다음과 같이 일치합니다:

"The Great Gatsby"
"the catcher in the rye"
"THE LORD OF THE RINGS"

배열 요소에 대한 regex 사용하기

MongoDB의 regex 능력은 배열에도 적용됩니다! 예를 들어, 장르 배열을 가진 영화 컬렉션이 있다면, 특정 패턴에 맞는 장르를 가진 영화를 검색할 수 있습니다.

db.movies.find({ genres: /^Sci/ })

이렇게 하면 장르가 "Sci"로 시작하는 영화를 찾습니다:

{ title: "Interstellar", genres: ["Sci-Fi", "Adventure", "Drama"] }
{ title: "The Matrix", genres: ["Sci-Fi", "Action"] }

정규 표현식 쿼리 최적화

regex는 강력하지만, 신중하게 사용하지 않으면 느려질 수 있습니다. regex 쿼리를 최적화하는 몇 가지 팁을 제공합니다:

  1. 안커 사용: 문자열의 시작에 ^를 사용하고, 끝에 $를 사용합니다.
  2. 와일드카드로 시작하지 마세요: .*abc와 같은 패턴은 느립니다.
  3. 인덱스 사용: 가능하다면, 쿼리 필드에 인덱스를 생성합니다.

최적화된 쿼리의 예:

db.books.find({ title: /^The.*Potter$/i })

이 쿼리는 "The"로 시작하고 "Potter"로 끝나는(대소문자 구분없이) 책을 효율적으로 찾습니다.

MongoDB에서의 Regex 메서드

MongoDB는 여러 가지 regex 메서드를 제공합니다. 다음 표를 참조하세요:

메서드 설명 예제
$regex 패턴 일치 기능을 제공합니다 { name: { $regex: /john/i } }
$options $regex 일치 행동을 수정합니다 { name: { $regex: /john/, $options: 'i' } }

$options에는 다음이 포함될 수 있습니다:

  • i 대소문자 구분없음
  • m 여러 줄 일치
  • x regex에서 공백을 무시

실무 연습

이제 우리 지식을 테스트해 보겠습니다! 가정해 봅시다, 이메일 컬렉션이 있다면, gmail 계정으로부터 온 모든 이메일을 찾고 싶습니다.

db.emails.find({ address: /.*@gmail\.com$/i })

이 regex는:

  • .* 모든 문자를 일치시킵니다.
  • @gmail\.com 정확히 "@gmail.com"을 일치시킵니다(점을 이스케이프시킵니다).
  • $ 문자열의 끝에서 일치시킵니다.
  • i 대소문자 구분없음

따라서 다음과 같이 일치합니다:

[email protected]
[email protected]

하지만 다음은 일치하지 않습니다:

[email protected]
[email protected]

결론

축하합니다! MongoDB에서 regex의 세계로 첫 걸음을 냈습니다. 기억하세요, 강력한 도구인 regex는 신중하게 사용해야 합니다. 간단하게 시작하고, 충분히 테스트하고, 필요할 때 최적화하세요.

저는 항상 학생들에게 이야기하는 것처럼, 가장 좋은 학습 방법은 실천하는 것입니다. 그러니 MongoDB 셸을 열고 regex를 실험해 보세요. 누구 knows? 데이터베이스 쿼리의 샬록 Holmes가 될지도 모릅니다!

행복하게 코딩하세요, 그리고 regex가 함께 하기를 바랍니다!

Credits: Image by storyset