데이터베이스/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 |