본문 바로가기

DB/MongoDB

[MongoDB] 12. 쿼리작성하기 - 정규 표현식, 문자열 연산자, Cursor, $(배열 위치 연산자), $where 연산자

728x90
반응형

정규 표현식

MongoDB에서 정규 표현식을 사용하여 원하는 도큐먼트를 선택할 수 있다.

// db.컬렉션.find({필드:/정규표현식/})
db.area.find({county:/시$/}).count() // 시로 끝나는 county 도큐먼트의 개수

정규 표현식 사용을 위한 메타 문자

메타문자 설명 예시
* 앞의 문자를 0개 이상 찾음 zo* --> z, zo, zoo,zooo
+ 앞의 문자를 1개 이상 찾음 zo+ --> zo, zoo, zooo
? 앞의 문자를 0개나 1개 찾음 zo? --> z,zo
^ ^문자열 : 문자열로 시작하는 것을 다 찾음
^[^문자열] : 문자열로 시작하는 것을 제외하고 다 찾음
^박 : 박, 박수
^[^박] : 홍길동, 김철수
$ $문자열 : 문자열로 끝나는 것을 다 찾음 $박 : 수박, 박박
. '\n'을 제외한 모든 단일 문자 검색 a.c --> abc, a1c,a-c,a?c
[   ] 식의 시작과 끝을 표시 [1-4] --> 1,2,3,4
{   } 수량자 식의 시작과 끝 표사 a{2,3} --> aa, aaa
| 둘 이상의 항목에서 선택 (z|f)ood --> zood, food
/ 리터럴 정규식 패턴의 시작과 끝 /g --> 전역 /i --> 대수문자 무시
\ 다음에 오는 문자를 특수 문자, 리터럴, 이스케이프로 표시 \n : 개행문자     \( : (
\\ : \
\b 단어와 공백 사이의 위치를 검색 er\b --> er뒤에 문자가 없는 모든 것
\B 공백이 아닌것의 위치를 탐색 er\B --> er뒤에 공백이 아닌 모든 것
\d 숫자를 찾음 \d[2] --> 12, 34, 56, 13
\D 문자를 찾음 \D[2] --> ab, cd, ef, af
\w A-Z, a-z, 0-9, _를 찾는다.[A-Za-z0-9_] \w --> jung, kwang, one
\W \w를 제외한 모든 것[^A-Za-z0-9_] \W --> '',!@#$%^&*()
[xyz] xyz중 하나를 찾음 [xyz] --> x,y,z
[^xyz] xyz가 아닌 모든 것 [^xyz] --> a,b,c,d,e,1,2,3
-a[z] 지정한 범위에서 문자를 찾음 [a-z] --> 모든 소문자
[^a-z] 지정한 범위가 아닌 모든 것을 찾음 [^a-z] --> 소문자가 아닌 모든 것
{n} n개를 찾음 o{2} --> oo
{n,} n개 이상을 찾음 o{2,} --> oo,ooo,oooo
{n,m} n개 이상 m개 이하를 찾음 o{2,3} --> oo,ooo
(Pattern) Pattern을 찾고 일치하는 항목 저장 (ch\sec)[1-9] --> cha1 ~ cha9
(?:pattern) Pattern을 찾지만 저항하진 않음 Industr(?:y|ies) --> Industry | Industries
(?=pattern) 일치 항목을 찾은 후 일치한 텍스트의 앞에서 다음 일치 항목에 대해 검색 ^(?=.*\d).{4,8}$ --> 4-8개의 문자로 구성되고 적어도 하나의 숫차를 포함.
(?!pattern) 일치하지 않은 항목을 찾은 후 다음 일치 항목에 대한 검색 시작 \b(?!th)\w+\b --> th로 시작하지 않는 단어 검색

문자열 연산자

  • $regex : 정규 표현식과 맞는 도큐먼트 선택(regular expression)
    • 몽고디비의 정규표현식 flag(생략가능)(JS 문법)
      • i (Ignore Case): 대소문자 무시
      • m (Multi Line): 앵커(^) 사용시 \n 무력화
      • x : 정규식 내의 공백 무시
      • s : (.)을 사용할 때 \n 포함해서 매치
      • g (global) : 문자열 내의 모든 패턴 검색 
      • u (unicode) : 유니코드 전체를 지원
      • y (sticky) : 문자 내 특정 위치에서 검색을 진행하는 'sticky' 모드를 활성화
//db.컬렉션.find({필드 : {$regex: 정규표현식}})
db.area.find({county:{$regex:/구$/,$gte:"아",$lt:"자"}},{county:true})
// "구"로 끝나면서 첫글자의 초성이 "ㅇ"인 county 출력

  • $text : 문자열 검색
    • 제목이나 본문 등 텍스트가 많은 경우에 (컬렉션 전체에서) 원하는 텍스트를 쉽게 검색하는 방법
    • 사용하려면 "인덱스"가 필요함.
    • $text와 같이 쓰이는 연산자들
연산자 설명
$search 검색성 설정, 검색어를 포함한 도큐먼트 검색
$language 언어 설정(영어: en, 프랑스어 : fr)
$caseSensitive 대소문자 구별 여부 설정
$diacriticSensitive 알파벳 위아래에 붙는 기호 무시 여부 설정
  • 인덱스 만들기
// db.컬렉션.createIndex({필드 : 인덱스 이름})
db.inventory.createIndex({item:"text", tags:"text"})
// item과 tags에 대하여 인덱스 생성, 인덱스 이름은 text

  • $search로 검색하기
//db.컬렉션.find({$text:{$search:'검색할 것'}})
// 사용법1 : 그냥 검색 
db.inventory.find({$text:{$search:"hello"}})
// 사용법2 : or 
db.inventory.find({$text:{$search:"red blank"}}) // red 또는 blank
// 사용법3 : and 
db.inventory.find({$text:{$search:'"red" "blank"'}}) // red이고 blank
// 사용법4 : 찾을건 찾고 제외할것은 제외하기
db.inventory.find({$text:{$search:"red -blank"}}) // red를 찾되, blank는 제외

커서 Cursor

  • MongoDB는 커서를 사용하여 find()의 결과를 반환한다
  • 커서는 쿼리 결과에 대한 포인터
  • 커서를 이용하여 결과 갯수를 제한하거나 결과 중 몇 개를 건너 뛰거나, 여러 키를 조합한 결과를 정렬하는 등의 조작이 가능하다.
  • 커서 만들기
 // var 변수명 = db.컬렉션.find()
 var cursor = db.rating.find()
 cursor

  • 한개 씩 읽기와 함수 적용
// 한개씩 읽기
// 커서.next()
cursor.next()

// 함수 적용
// 커서.forEach(function(x) {})
cursor.forEach(function(x) {print(x.rating)})
// rating 값을 하나씩 출력

  • 건너뛰기
//var 변수 = db.컬렉션.find().skip(건널뛸 숫자)
var cursor = db.rating.find().skip(5)

  • 제한
// var 변수명 = db.컬렉션.find().limit(제한할 개수)
var cursor = db.rating.find().limit(5)

$(배열 위치 연산자)

  • 쿼리 도큐먼트와 일치하는 배열 요소 및 요소의 위치를 알아내서 접근한다.
  • 쿼리하는 값의 배열 내 인덱스를 몰라도 접근할 수 있다.
// db.inventory.find({필드:값},{"배열 필드.$":true})
db.inventory.find({"tags":"red"},{"tags.$":true})
// tags 필드의 값이 red인 도큐먼트의 tags의 red만 출력

$where

  • 키/값 쌍만으로 정확하기 표현할 수 없는 쿼리도 있다.
  • $where 절로 임의의 자바 스크립트를 쿼리의 일부분으로 실행할 수 있다.
  • 보안상의 이유로 자제된다.
  • 다른 쿼리보다 속도가 느리므로 반드시 필요한 경우에만 사용해야한다. 
db.컬렉션.find({$where : function() {}})

정확하 결과는 아니나 자바 스크립트 함수가 사용될 수 있음을 확인.

728x90
반응형