SlideShare ist ein Scribd-Unternehmen logo
1 von 31
MongoDB완벽 가이드- 4장 쿼리하기 발표 : 유유(유장혁)
순서 찾기 소개 쿼리 조건 형 특정 쿼리 $where 쿼리 커서 커서 내부 작동
찾기 소개
Find 메소드 db.c.find( ) 컬렉션 C 안의 모든 문서를 반환 find 메소드에 쿼리 문서가 없다면 빈 쿼리 문서 {}로 인식 빈 쿼리 문서(즉,{})는 컬렉션 내 모든 것과 일치한다 검색 제한 키 /값 쌍 db.users.find( { "age" : 27 } ) 조건1 AND 조건2 AND . . . AND 조건N
반환 받을 키 지정하기 모든 키/값 정보가 필요한 건 아닐 경우 db.users.find ( { }, ( " username" : 1, "email" : 1 } ) “_id" 키는 특별히 지정하지 않아도 항상 반환 특정 키 /값 쌍을 제외 db.users.find( { }, { “username" : 0 } )
제약 사항 쿼리의 값은 데이터베이스 관점에서는 반드시 상수여야 한다 (코드 내에서는 일반 변수여도 상관 없다) 문서 내 다른 키의 값을 참조할 수 없음 > db.stock.find( { "in_stock" : "this.num_sold" } ) / / 작동하지 않는다.
쿼리 조건
쿼리 조건절 비교 연산자 "$lt" - < "$lte" - <= "$gt" - > "$gte" - >= > db.users.find ( { " age " : { " $gte " 18, " $lte " : 30 } } ) "$ne" - != ‘not equal'
OR 쿼리 "$in“ 반대 "$nin" 하나의 키 에 대해 다양한 값들과 비교하는 쿼리에 사용 > db.raffle.find( { "ticket_no" : { "$in“ : [ 725, 542, 390 ] } } ) 다른 데이터형도가능 > db.users.find( { "user_id" : { "$in" : [ 12345, "joe" ] } ) "$or"  조금 더 일반적인 것이며 여러 키에 대해 주어진 값을 비교하는 쿼리에 사용 가능한 조건들의 배열 > db.raffle.find( { "$or" : [ { "ticket_no" : 725 }, { “winner " : true } ] } ) > db.raffle.find ( { "$or " : [ { "ticket_no" : { "$in" : [ 725, 542, 390] } } , { "winner" : true } ] } )
$not "$not“ 메타 조건절 특히 정규표현식과 함께 사용해 주어진 패턴과 일치하지 않는 문서를 찾을 때 유용하다 결과와 일치하지 않는 문서내 값 > db.users.find ( { "id_num" : { "$not" : { "$mod " : [ 5, 1 ] } } } )
조건절의 법칙 접두사 $를 가진 키들의 위치가 다르다 조회 쿼리에서 "$lt"는 내부 문서에서 사용하고 갱신 쿼리에서 “$inc"는 외부 문서를 위한 키다 조건절을 내부 문서의 키로,제한자는 외부 문서의 키로 사용한다. 하나의 키에 여러 조건을 걸 수 있다. 하나의 키에 여러 조건절을 사용할 수 있다. 하나의 키에 여러 갱신 제한자는사용할 수 없다
형 특정 쿼리
null null은 자신과 일치하는 것 뿐만 아니라 “존재하지 않는” 것과도 일치 만약 값이 null인 키 만 찾고 싶다면,"$exists" 조건절을 사용해 키 가 null인 키의 존재 여부를 확인할 수 있다. > db.c.Find ( { "z" : { "$in" : [ null ], "$exists" : true } } )
정규표현식 유연하게 매칭되는 문자열을 찾아 낼 때 / 대소문자 구별 없이 찾을 수 있다 > db.users.find( { "name" : / joe/ i } ) 정규표현식의 플래그 (i)는 사용할 수 있으나 꼭 필요한 것은 아니다. > db.users.find ( { "name" : / joey? / i } ) PCRE  = Perl Compatible Regular Expression = Perl 호환 정규표현식 /joey?/ prefixregular-expression = 프리픽스정규표현식 /^joey/ 해당하는 쿼리를 더 빠르게 실행
배열에 쿼리하기 배열의 각 요소는 대개 전체 키의 값인 것처럼 다룰 수 있다 전체 배열 모두와 정확하게 일치하는 것을 쿼리할 수도 있다. 배열 내 특정 요소를 쿼리하려면,key.index구문을 사용하여 순서를 지정할 수 있다. 배열은 항상 0에서 시작 > db. food.find( { "fruit.2" : "peach"})
$all 연산자 배열 내 하나 이상의 요소가 일치하는 배열을 찾을 때 > db. food.find ( { “fruit” : { $all : [ "apple“, "banana" ] } } ) $size 연산자 주어진 크기의 배열을 반환 > db.food.find( { "fruit“ : {"$size" : 3}}) "$size'’는 다른 $ 조건절과결합하여 사용할 수 없지만, 문서에 ”size”키를 추가하면 이런 쿼리를 처리할 수 있다 값의 증가는 매우 빠르게 이루어지므로 성능에 대해서는 크게 걱정할 필요가 없다 > db.food.find( { "size“ : { "$gt“ : 3 } } )
$slice 연산자 배열 요소의 부분 집합을 반환 오프셋과 요소 개수를 사용하여 원하는 범위에 있는 결과를 반환 > db. blog. posts. findOne ( criteria,{ "comments" : { "$slice" : -10 } } ) // 끝에서 10 > db.blog. posts. findOne ( criteria,{ "comments“ : { "$slice" : [ 23,10] } } ) // 24 ~ 34 특별히 명시하지 않는 한,"$slice" 연산자는 문서 내 모든 키를 반환한다 키 명시자에 직접 지정하지 않아도 "title"과 "content" 키 모두를 반환한다.
내장 문서에 쿼리하기 전체 문서 혹은 내장 문서 내 각 키/값 쌍을 대상 가능하다면 내장 문서를 쿼리할때는 특정 키나 키들을 가지고 쿼리하는 방법이 좋다 전체 문서를 대상으로 ‘정확한 일치’를 찾는 방법이 아니기 때문에 스키마가 변경되더라도 모든 쿼리 가 정상적으로 작동된다 점 표기 법을 사용 // URL 형식 > db. people. find ( { "name. first" : "Joe", "name.last“ : "Schmoe" } ) 점을 포함할 수 있고 이는 ‘내장 문서 내 항목에 접근’할 수 있다는 뜻이다 URL을 키로 삼을 때 잦은 문제를 야기시킨다
"$elemMatch“ 모든 키를 지정하지 않고도 조건을 정확하게 묶을 때 사용 배열 내에서 하나의 내장 문서를 찾기 위한 조건을 부분적으로 지정할 수 있도록 해준다 조건의 ‘그룹핑’을 지원한다 내장 문서 에 하나 이상의 키에 대 해 조건과 일치 여부를 확인할 때만 필요하다 > db. blog.find ( { "comments“ : { "$elemMatch“ :  { "author" : "joe" , "score" : ( "$gte" : 5 } } } } )
$where 쿼리
표현할 수 없는 쿼리들은 임의의 자바스크립트를 쿼리의 일부분으로 실행 일반 쿼리보다 훨씬 느리다 각 문서는 BSON에서 자바스크립트 객체로 변환해야 하기 때문 쓸 수 있는 색 인도 없다 두 키 의 값을 비교하는 쿼리 > db. foo. find ( { "$where“ :  function ( ) { ... }; 문자열 > db. foo.find( { "$where" : "this. x + this. Y == 10" } ) > db. foo. find ( { "$where" : "function( ) { return this. x + this. y == 10; } " } )
커서
쉘에서커서를 생성하기 위해서는 문서들을 컬렉션에 집어넣고,그에 대해 쿼리를 수행하고, 결과를 지역 변수”var”로 선언된 변수들은 지역 변수이다)에 할당 > var cursor db.collection.find( ) ; 한 번에 하나씩 결과를 볼 수 있다 쉘에서실제 프로그래밍을 하기에는 적합하지 않다. 커서의 next 메소드를사용 > while ( cursor.hasNext( ) ) { obj cursor.next( ); } 반복자iterator 인터페이스를 구현하고 있어서 forEach반복문에사용 > cursor. forEach ( function( x ) { } );
쉘은 데이터베이스에 바로 쿼리하지않는다 커서 객 체 상의 거의 모든 메소드는 커 서 자체를 반환하기 때문에 이 메소드들을 어 떤 순서로도 이 어 쓸 수 있다 이 시 점 에서 쿼 리 는 아직 수행되지 않았다. 쿼 리를 만들기 만 했을 뿐이다 > cursor. hasNext( ) 쉘은next 나hasNext메 소드 호출 시 서버 까지 왕복 횟수를 줄이기위해서한 번에 처음 100개 또는 4MB 크기의 결과(둘 중 작은 것)를 가지고 온다
제한, 건너뛰기, 정렬 제한 limit 함수 > db.c.find().limit(3) 건너뛰기 > db.c.find().skip(3) 정렬 객체를 매개 변수로 받는다 키/값 쌍의 셋이고,키는 키의 이름이고, 값은 정 렬방향이다 정렬 방향은 1(오름치순)이 거 나 -1(내림차순) > db.c.find().sort({ username : 1, age : -1 } ) 조합 > db.stock.find( { "desc" : "mp3" } ). limit(50).skip(50).sort ( { "price“ : -1 } )
비교 순서 데 이 터 형을 비교하는 위계 구조 최소값헝 null형 숫자형(정수형, 롱형, 더블형) 문자열형 객체 문서형 배열형 이진 데이터형 객체 ID형 불리언형 날짜형 타임스탬프형Timestamp 정규표현식형 최대값형
많은 수의 skip 피하기 많은 수의 결과에서 skip은 느릴 수 있다 문서 자체에 조건을 만들어두거나, 또는 바로 전 쿼리의 결과를 가지고 다음 쿼리를 계산할 Skip을 사용하지 않고 페이지 나누기 Limit 를 사용하여 첫 번째 페이지를 반환하고 다음 페이지들은 첫 페이지부터 오프셋을 주어 반환하는 것이다 > var page1 = db.foo.find( criteria ).limit (100) > var page2 = db.foo.find ( criteria ).skip (100). limit(100 )
문서 랜덤 찾기 순진한(그리고 느린) 방법은 문서의 전체 개수를 세고 find를 한 후,0부터 컬렉션의 크기 사이의 랜덤으로 정 해진 숫자만큼 건너뛰는 것이다. 결국 컬렉션에서 랜덤으로 요소를 봐야 한다면 훨씬 효율적 인 방법 문서를 입력 할 때 랜덤 키를 별도로 추가하는 것이다 skip을 사용하는 대신에 랜덤 수를 계산해 사용할수있다 랜덤 키가 색인되었는지 명확히 해야 한다
고급 쿼리 옵션 일반형 쿼리형태 > var cursor = db.foo.find ( { "foo" : "bar" } ) 감싼형 쿼리형태 > var cursor = db.foo. find({ "foo" : "bar"}) .sort ({"x" : 1}) $maxscan : 정수형 쿼리에서 살펴볼 문서의 최대 숫자를 지정 $min : 문서형 쿼리의 시작 조건 $max : 문서형 쿼리의 끝 조건 $hint : 문서형 서버에 쿼 리 에 서 사용할 색 인을 일러준다 $explain : 불리언형 쿼리가 어떻게 수행될 것인지에 대한 설명 (사용된 인텍스, 결과의 개수, 수행 시간) $snapshot : 불리언형 쿼리를 수행한 시점 후의 일관된 스냅샷을 유지할 것을 지정
커서 내부 작동
커서 클라이언트가 보는 커서 클라이언트 커서 가 나타내는 데이터베이스가 보호 커서 커서는 메모리와 자원을 점유한다 커서를 종료하는 (그리고 이후 작업도 정리함) 조건 커서는 조건과 일치하는 결과를 모두 살펴본 후에는 스스로 정리한다 커서가 클라이언트 측에서 유효 영역 비깥으로나갈 경우,드라이버는 데이터베이스에 특별한 메시지를 보내 커서를 종료해도 된다고 알린다 시용자가 결과를 아직 다 살펴보지 않았고, 커서가  여전히 유효 영역 내에 있더라도 10분 동안 활동이 없으면 데이터베이스 커서는 자동으로 죽는다 (타임이웃에 의한 종료) 타임아웃을 못하게 하는 immortal 이라는 함수 커서의 타임아웃을 비활성화했다면 반드시 결과를 모두 살펴보거나 또는 명확히 커서를 종료해야 한다. 그렇지 않으면 커서는 데 이 터 베이스에 계속 남아 자원을 점유할 것이다.

Weitere ähnliche Inhalte

Was ist angesagt?

The InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQLThe InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQL
Morgan Tocker
 

Was ist angesagt? (20)

Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용
 
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxMySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptx
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docx
 
MySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptxMySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptx
 
MariaDB MaxScale
MariaDB MaxScaleMariaDB MaxScale
MariaDB MaxScale
 
Dd and atomic ddl pl17 dublin
Dd and atomic ddl pl17 dublinDd and atomic ddl pl17 dublin
Dd and atomic ddl pl17 dublin
 
MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELK
 
Redis database
Redis databaseRedis database
Redis database
 
Advanced MySQL Query Tuning
Advanced MySQL Query TuningAdvanced MySQL Query Tuning
Advanced MySQL Query Tuning
 
MySQL GTID 시작하기
MySQL GTID 시작하기MySQL GTID 시작하기
MySQL GTID 시작하기
 
MariaDB 10: The Complete Tutorial
MariaDB 10: The Complete TutorialMariaDB 10: The Complete Tutorial
MariaDB 10: The Complete Tutorial
 
The InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQLThe InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQL
 
Automated master failover
Automated master failoverAutomated master failover
Automated master failover
 
MySQL 5.5 Guide to InnoDB Status
MySQL 5.5 Guide to InnoDB StatusMySQL 5.5 Guide to InnoDB Status
MySQL 5.5 Guide to InnoDB Status
 
ProxySQL High Availability (Clustering)
ProxySQL High Availability (Clustering)ProxySQL High Availability (Clustering)
ProxySQL High Availability (Clustering)
 
[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기
 
Innodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドInnodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライド
 
The MySQL Query Optimizer Explained Through Optimizer Trace
The MySQL Query Optimizer Explained Through Optimizer TraceThe MySQL Query Optimizer Explained Through Optimizer Trace
The MySQL Query Optimizer Explained Through Optimizer Trace
 

Ähnlich wie Mongo DB 완벽가이드 - 4장 쿼리하기

Regex & property sheet
Regex & property sheetRegex & property sheet
Regex & property sheet
Youngkwon Lee
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
ETRIBE_STG
 

Ähnlich wie Mongo DB 완벽가이드 - 4장 쿼리하기 (20)

MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기
 
Hacosa js study 2주차
Hacosa js study 2주차Hacosa js study 2주차
Hacosa js study 2주차
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
 
8 거대한 표현을 잘게 쪼개기
8 거대한 표현을 잘게 쪼개기8 거대한 표현을 잘게 쪼개기
8 거대한 표현을 잘게 쪼개기
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
Regex & property sheet
Regex & property sheetRegex & property sheet
Regex & property sheet
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
6 function
6 function6 function
6 function
 
Hacosa j query 10th
Hacosa j query 10thHacosa j query 10th
Hacosa j query 10th
 
06장 함수
06장 함수06장 함수
06장 함수
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
Node.js + Express + MongoDB
Node.js + Express + MongoDBNode.js + Express + MongoDB
Node.js + Express + MongoDB
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2
 
Regex
RegexRegex
Regex
 
Asp.net Razor
Asp.net Razor Asp.net Razor
Asp.net Razor
 
Perl Script
Perl ScriptPerl Script
Perl Script
 
업무 자동화
업무 자동화업무 자동화
업무 자동화
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
Javascript
JavascriptJavascript
Javascript
 

Mehr von JangHyuk You (8)

게임 프로그래머를 위한 기초 수학 및 물리 - 8장
게임 프로그래머를 위한 기초 수학 및 물리 - 8장게임 프로그래머를 위한 기초 수학 및 물리 - 8장
게임 프로그래머를 위한 기초 수학 및 물리 - 8장
 
게임 프로그래머를 위한 기초 수학 및 물리 - 9장
게임 프로그래머를 위한 기초 수학 및 물리 - 9장게임 프로그래머를 위한 기초 수학 및 물리 - 9장
게임 프로그래머를 위한 기초 수학 및 물리 - 9장
 
도메인 주도 설계 - 6장 도메인 객체의 생명주기
도메인 주도 설계 - 6장 도메인 객체의 생명주기도메인 주도 설계 - 6장 도메인 객체의 생명주기
도메인 주도 설계 - 6장 도메인 객체의 생명주기
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
 
TAOCP1 - 2.2.2 - 순차할당
TAOCP1 - 2.2.2 - 순차할당TAOCP1 - 2.2.2 - 순차할당
TAOCP1 - 2.2.2 - 순차할당
 
TAOCP1 - 1.2.11.1 - O 표기법
TAOCP1 - 1.2.11.1 - O 표기법TAOCP1 - 1.2.11.1 - O 표기법
TAOCP1 - 1.2.11.1 - O 표기법
 
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
 
Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기
 

Mongo DB 완벽가이드 - 4장 쿼리하기

  • 1. MongoDB완벽 가이드- 4장 쿼리하기 발표 : 유유(유장혁)
  • 2. 순서 찾기 소개 쿼리 조건 형 특정 쿼리 $where 쿼리 커서 커서 내부 작동
  • 4. Find 메소드 db.c.find( ) 컬렉션 C 안의 모든 문서를 반환 find 메소드에 쿼리 문서가 없다면 빈 쿼리 문서 {}로 인식 빈 쿼리 문서(즉,{})는 컬렉션 내 모든 것과 일치한다 검색 제한 키 /값 쌍 db.users.find( { "age" : 27 } ) 조건1 AND 조건2 AND . . . AND 조건N
  • 5. 반환 받을 키 지정하기 모든 키/값 정보가 필요한 건 아닐 경우 db.users.find ( { }, ( " username" : 1, "email" : 1 } ) “_id" 키는 특별히 지정하지 않아도 항상 반환 특정 키 /값 쌍을 제외 db.users.find( { }, { “username" : 0 } )
  • 6. 제약 사항 쿼리의 값은 데이터베이스 관점에서는 반드시 상수여야 한다 (코드 내에서는 일반 변수여도 상관 없다) 문서 내 다른 키의 값을 참조할 수 없음 > db.stock.find( { "in_stock" : "this.num_sold" } ) / / 작동하지 않는다.
  • 8. 쿼리 조건절 비교 연산자 "$lt" - < "$lte" - <= "$gt" - > "$gte" - >= > db.users.find ( { " age " : { " $gte " 18, " $lte " : 30 } } ) "$ne" - != ‘not equal'
  • 9. OR 쿼리 "$in“ 반대 "$nin" 하나의 키 에 대해 다양한 값들과 비교하는 쿼리에 사용 > db.raffle.find( { "ticket_no" : { "$in“ : [ 725, 542, 390 ] } } ) 다른 데이터형도가능 > db.users.find( { "user_id" : { "$in" : [ 12345, "joe" ] } ) "$or" 조금 더 일반적인 것이며 여러 키에 대해 주어진 값을 비교하는 쿼리에 사용 가능한 조건들의 배열 > db.raffle.find( { "$or" : [ { "ticket_no" : 725 }, { “winner " : true } ] } ) > db.raffle.find ( { "$or " : [ { "ticket_no" : { "$in" : [ 725, 542, 390] } } , { "winner" : true } ] } )
  • 10. $not "$not“ 메타 조건절 특히 정규표현식과 함께 사용해 주어진 패턴과 일치하지 않는 문서를 찾을 때 유용하다 결과와 일치하지 않는 문서내 값 > db.users.find ( { "id_num" : { "$not" : { "$mod " : [ 5, 1 ] } } } )
  • 11. 조건절의 법칙 접두사 $를 가진 키들의 위치가 다르다 조회 쿼리에서 "$lt"는 내부 문서에서 사용하고 갱신 쿼리에서 “$inc"는 외부 문서를 위한 키다 조건절을 내부 문서의 키로,제한자는 외부 문서의 키로 사용한다. 하나의 키에 여러 조건을 걸 수 있다. 하나의 키에 여러 조건절을 사용할 수 있다. 하나의 키에 여러 갱신 제한자는사용할 수 없다
  • 13. null null은 자신과 일치하는 것 뿐만 아니라 “존재하지 않는” 것과도 일치 만약 값이 null인 키 만 찾고 싶다면,"$exists" 조건절을 사용해 키 가 null인 키의 존재 여부를 확인할 수 있다. > db.c.Find ( { "z" : { "$in" : [ null ], "$exists" : true } } )
  • 14. 정규표현식 유연하게 매칭되는 문자열을 찾아 낼 때 / 대소문자 구별 없이 찾을 수 있다 > db.users.find( { "name" : / joe/ i } ) 정규표현식의 플래그 (i)는 사용할 수 있으나 꼭 필요한 것은 아니다. > db.users.find ( { "name" : / joey? / i } ) PCRE = Perl Compatible Regular Expression = Perl 호환 정규표현식 /joey?/ prefixregular-expression = 프리픽스정규표현식 /^joey/ 해당하는 쿼리를 더 빠르게 실행
  • 15. 배열에 쿼리하기 배열의 각 요소는 대개 전체 키의 값인 것처럼 다룰 수 있다 전체 배열 모두와 정확하게 일치하는 것을 쿼리할 수도 있다. 배열 내 특정 요소를 쿼리하려면,key.index구문을 사용하여 순서를 지정할 수 있다. 배열은 항상 0에서 시작 > db. food.find( { "fruit.2" : "peach"})
  • 16. $all 연산자 배열 내 하나 이상의 요소가 일치하는 배열을 찾을 때 > db. food.find ( { “fruit” : { $all : [ "apple“, "banana" ] } } ) $size 연산자 주어진 크기의 배열을 반환 > db.food.find( { "fruit“ : {"$size" : 3}}) "$size'’는 다른 $ 조건절과결합하여 사용할 수 없지만, 문서에 ”size”키를 추가하면 이런 쿼리를 처리할 수 있다 값의 증가는 매우 빠르게 이루어지므로 성능에 대해서는 크게 걱정할 필요가 없다 > db.food.find( { "size“ : { "$gt“ : 3 } } )
  • 17. $slice 연산자 배열 요소의 부분 집합을 반환 오프셋과 요소 개수를 사용하여 원하는 범위에 있는 결과를 반환 > db. blog. posts. findOne ( criteria,{ "comments" : { "$slice" : -10 } } ) // 끝에서 10 > db.blog. posts. findOne ( criteria,{ "comments“ : { "$slice" : [ 23,10] } } ) // 24 ~ 34 특별히 명시하지 않는 한,"$slice" 연산자는 문서 내 모든 키를 반환한다 키 명시자에 직접 지정하지 않아도 "title"과 "content" 키 모두를 반환한다.
  • 18. 내장 문서에 쿼리하기 전체 문서 혹은 내장 문서 내 각 키/값 쌍을 대상 가능하다면 내장 문서를 쿼리할때는 특정 키나 키들을 가지고 쿼리하는 방법이 좋다 전체 문서를 대상으로 ‘정확한 일치’를 찾는 방법이 아니기 때문에 스키마가 변경되더라도 모든 쿼리 가 정상적으로 작동된다 점 표기 법을 사용 // URL 형식 > db. people. find ( { "name. first" : "Joe", "name.last“ : "Schmoe" } ) 점을 포함할 수 있고 이는 ‘내장 문서 내 항목에 접근’할 수 있다는 뜻이다 URL을 키로 삼을 때 잦은 문제를 야기시킨다
  • 19. "$elemMatch“ 모든 키를 지정하지 않고도 조건을 정확하게 묶을 때 사용 배열 내에서 하나의 내장 문서를 찾기 위한 조건을 부분적으로 지정할 수 있도록 해준다 조건의 ‘그룹핑’을 지원한다 내장 문서 에 하나 이상의 키에 대 해 조건과 일치 여부를 확인할 때만 필요하다 > db. blog.find ( { "comments“ : { "$elemMatch“ : { "author" : "joe" , "score" : ( "$gte" : 5 } } } } )
  • 21. 표현할 수 없는 쿼리들은 임의의 자바스크립트를 쿼리의 일부분으로 실행 일반 쿼리보다 훨씬 느리다 각 문서는 BSON에서 자바스크립트 객체로 변환해야 하기 때문 쓸 수 있는 색 인도 없다 두 키 의 값을 비교하는 쿼리 > db. foo. find ( { "$where“ : function ( ) { ... }; 문자열 > db. foo.find( { "$where" : "this. x + this. Y == 10" } ) > db. foo. find ( { "$where" : "function( ) { return this. x + this. y == 10; } " } )
  • 23. 쉘에서커서를 생성하기 위해서는 문서들을 컬렉션에 집어넣고,그에 대해 쿼리를 수행하고, 결과를 지역 변수”var”로 선언된 변수들은 지역 변수이다)에 할당 > var cursor db.collection.find( ) ; 한 번에 하나씩 결과를 볼 수 있다 쉘에서실제 프로그래밍을 하기에는 적합하지 않다. 커서의 next 메소드를사용 > while ( cursor.hasNext( ) ) { obj cursor.next( ); } 반복자iterator 인터페이스를 구현하고 있어서 forEach반복문에사용 > cursor. forEach ( function( x ) { } );
  • 24. 쉘은 데이터베이스에 바로 쿼리하지않는다 커서 객 체 상의 거의 모든 메소드는 커 서 자체를 반환하기 때문에 이 메소드들을 어 떤 순서로도 이 어 쓸 수 있다 이 시 점 에서 쿼 리 는 아직 수행되지 않았다. 쿼 리를 만들기 만 했을 뿐이다 > cursor. hasNext( ) 쉘은next 나hasNext메 소드 호출 시 서버 까지 왕복 횟수를 줄이기위해서한 번에 처음 100개 또는 4MB 크기의 결과(둘 중 작은 것)를 가지고 온다
  • 25. 제한, 건너뛰기, 정렬 제한 limit 함수 > db.c.find().limit(3) 건너뛰기 > db.c.find().skip(3) 정렬 객체를 매개 변수로 받는다 키/값 쌍의 셋이고,키는 키의 이름이고, 값은 정 렬방향이다 정렬 방향은 1(오름치순)이 거 나 -1(내림차순) > db.c.find().sort({ username : 1, age : -1 } ) 조합 > db.stock.find( { "desc" : "mp3" } ). limit(50).skip(50).sort ( { "price“ : -1 } )
  • 26. 비교 순서 데 이 터 형을 비교하는 위계 구조 최소값헝 null형 숫자형(정수형, 롱형, 더블형) 문자열형 객체 문서형 배열형 이진 데이터형 객체 ID형 불리언형 날짜형 타임스탬프형Timestamp 정규표현식형 최대값형
  • 27. 많은 수의 skip 피하기 많은 수의 결과에서 skip은 느릴 수 있다 문서 자체에 조건을 만들어두거나, 또는 바로 전 쿼리의 결과를 가지고 다음 쿼리를 계산할 Skip을 사용하지 않고 페이지 나누기 Limit 를 사용하여 첫 번째 페이지를 반환하고 다음 페이지들은 첫 페이지부터 오프셋을 주어 반환하는 것이다 > var page1 = db.foo.find( criteria ).limit (100) > var page2 = db.foo.find ( criteria ).skip (100). limit(100 )
  • 28. 문서 랜덤 찾기 순진한(그리고 느린) 방법은 문서의 전체 개수를 세고 find를 한 후,0부터 컬렉션의 크기 사이의 랜덤으로 정 해진 숫자만큼 건너뛰는 것이다. 결국 컬렉션에서 랜덤으로 요소를 봐야 한다면 훨씬 효율적 인 방법 문서를 입력 할 때 랜덤 키를 별도로 추가하는 것이다 skip을 사용하는 대신에 랜덤 수를 계산해 사용할수있다 랜덤 키가 색인되었는지 명확히 해야 한다
  • 29. 고급 쿼리 옵션 일반형 쿼리형태 > var cursor = db.foo.find ( { "foo" : "bar" } ) 감싼형 쿼리형태 > var cursor = db.foo. find({ "foo" : "bar"}) .sort ({"x" : 1}) $maxscan : 정수형 쿼리에서 살펴볼 문서의 최대 숫자를 지정 $min : 문서형 쿼리의 시작 조건 $max : 문서형 쿼리의 끝 조건 $hint : 문서형 서버에 쿼 리 에 서 사용할 색 인을 일러준다 $explain : 불리언형 쿼리가 어떻게 수행될 것인지에 대한 설명 (사용된 인텍스, 결과의 개수, 수행 시간) $snapshot : 불리언형 쿼리를 수행한 시점 후의 일관된 스냅샷을 유지할 것을 지정
  • 31. 커서 클라이언트가 보는 커서 클라이언트 커서 가 나타내는 데이터베이스가 보호 커서 커서는 메모리와 자원을 점유한다 커서를 종료하는 (그리고 이후 작업도 정리함) 조건 커서는 조건과 일치하는 결과를 모두 살펴본 후에는 스스로 정리한다 커서가 클라이언트 측에서 유효 영역 비깥으로나갈 경우,드라이버는 데이터베이스에 특별한 메시지를 보내 커서를 종료해도 된다고 알린다 시용자가 결과를 아직 다 살펴보지 않았고, 커서가 여전히 유효 영역 내에 있더라도 10분 동안 활동이 없으면 데이터베이스 커서는 자동으로 죽는다 (타임이웃에 의한 종료) 타임아웃을 못하게 하는 immortal 이라는 함수 커서의 타임아웃을 비활성화했다면 반드시 결과를 모두 살펴보거나 또는 명확히 커서를 종료해야 한다. 그렇지 않으면 커서는 데 이 터 베이스에 계속 남아 자원을 점유할 것이다.