데이터베이스/MongoDB

문자열 연산자

haventmetyou 2023. 12. 28. 11:54

◎ $regex 연산자

  • 값이 정규 표현식과 맞는 도큐먼트를 선택
  • $regex 연산자는 옵션 값을 설정할 수 있어 다른 연산자와는 형식이 조금 다름
# 연산자의 형식 3가지
{ <field>: {$regex: /pattern/, $options: '<options>'} }
{ <field>: {$regex: 'pattern', $options: '<options>'} }
{ <field>: {$regex: /pattern/<options>} }
옵션 설명
i 대소문자 무시
m 정규식에서 앵커(^)를 사용할 때 값에 \n이 있다면 무력화
x 정규식 안에 있는 공백을 모두 무시
s 점(.)을 사용할 때 \n을 포함해서 매치

<options> 자리에는 표의 네 가지 문자를 넣을 수 있음

 

◎ $text 연산자

 

$text 연산자는 해당 컬렉션의 텍스트 인덱스 안에서만 작동

db.stores.insertMany(
[
  { _id: 1, name: 'Java Hut', description: 'Coffee and cakes'},
  { _id: 2, name: 'Burger Buns', description: 'Gourmet hamburgers'},
  { _id: 3, name: 'Coffee shoping', description: 'Just coffee'},
  { _id: 4, name: 'Clothes Clothes Clothes', description: 'Discount clothing'},
  { _id: 5, name: 'Java Shopping', description: 'Indonesian goods'},
  { _id: 6, name: '영희의 옷', description: '옷이 펄럭거리다'},
  { _id: 7, name: '달리는 철수', description: '철수는 인도인'},
]
)

/* $text 연산자를 이용해 문자열을 검색하려면 먼저 문자열 인덱스를 생성해야 함
예시에서는 name, description 필드에 텍스트 인덱스 설정하는 명령어 사용 */
db.stores.createIndex( {name: 'text', description: 'text'})

 

# 사용 예시
db.stores.find({$text: {$search: 'coffee'}})

  • 기본적으로 대소문자를 구분하지 않고 검색
db.stores.find({$text: {$search: 'bake coffee cake'}})

  • 여러 단어를 띄어쓰기와 함께 사용하게 되면 해당 단어들 중 일부만 포함된 도큐먼트라도 불러오게 됨
db.stores.find({$text: {$search: "\"coffee shop\""}})

 

  • 띄어쓰기를 한 상태의 문구를 검색하고 싶은 경우 큰따옴표 앞에 "\" 문자를 붙여 큰따옴표를 이스케이핑
  • 작은따옴표는 적용되지 않으므로 반드시 큰따옴표 사용
db.stores.find({$text: {$search: "shopped"}})

  • 언어별 대응 가능
  • shop의 과거형을 검색해도 shop의 진행형인 shopping이 포함된 도큐먼트를 불러올 수 있음 (한글은 적용 x)
# text 연산자 문법
{
  $text:
    {
      $search: <string>,
      $language: <string>,
      $caseSensitive: <boolean>,
      $diacriticSensitive: <boolean>
    }
}
필드 설명
$search 검색하려는 내용을 담음, 구절로 설정되지 않으면 띄어 쓴 단어를 포함한 모든 도큐먼트를 불러옴
$language 선택적, 검색하는 언어 설정, MongoDB가 지원하는 언어를 설정할 수 있음, 설정되지 않으면 인덱스에 설정된 내용을 따름
$caseSensitive 선택적, 불린 값을 가짐, 문자의 대소문자를 구분할지 결정
$diacriticSensitive 선택적, 불린 값을 가짐, 알파벳의 위아래에 붙이는 기호를 무시할지 결정, 기본 값은 false