몽고 디비 MongoDB The Definitive Guide.. Ch. 4 : Querying

1. Introduction to find [p45]

> db.user.find () >> 컬렉션의 모든 값.
> db.user.find({“username: : “joe”, “age” : 27}) > And 조건절이 됨.

Specifying Which Keys to Return

두번째 인자에 받고 싶은 키를 전달.. 통신량과 일을 줄임. 아이디 키는 항상 리턴.
> db.users.find({}, {“username” : 1, “email” : 1})
키를 제외시킬 때는 0 전달. 아이디를 제외하는 것도 가능.
> db.users.find({}, {“username” : 1, “_id” : 0})

Limitations

쿼리는 상수여야 함. (코드의 일반 변수) 즉, 다큐먼트의 다른 키의 밸류값을 가질 수 없음.
이런 쿼리는 $where Queries … 에서 설명.

2. Query Criteria

보다 다양한 조건. range, or clauses, negation .

Query Conditionals [p47]

“$lt” “$lte” “$gt” “$gte”   “$ne” not equal.  (ne : 모든 타입에 적용 가능)
> start = new Date(“03/04/2007”)
> db.users.find({“registered” : {“$lt” : start}})

OR Queries

“$in” “$or” “$nin”

> db.raffle.find({“ticketNo” : {“$in” : [725, 23, 39]}})
> db.users.find({“user_id” : {“$in” : [345, “steve”]}}) >> 스키마를 변경했을 때 여러 타입 혼용 가능.

“$in” 은 단일 키에서 OR 쿼리 가능. 여러 키를 대상으로는 “$or” 필요.

$not

meta conditional  >> 제외시킬 때.

Rules for Conditionals

조건식은 ‘내부 다큐’, 업데이트 문은 ‘외부 다큐’.
조건식은 단일키에 여러번 적용가능.. 업데이트문은 한번만 가능.

3. Type-Specific Queries

여러가지 타입과 특별한 거동.

null

널은 자신과 매치. 존재하지 않는 것도 매치. 어느 키가 널인지 확인하려면 그 키가 존재하는지도 확인해야함.
> db.c.find({“z” : {“$in” : [null], “$exists” : true}})

Regular Expressions

> db.users.find({“name” : /joe/i })  >> case insensitive matching.
몽고디비 Perl Compatible Regular Expression (PCRE)  사용.
정규식은 자신과 매치.. 정규식을 넣으면 그대로 인식.

Querying Arrays

$all

하나 이상의 요소와 매칭하는 어레이 검색 시. 순서는 무관.
> db.food.find({fruit : {$all : [“apple”, “banana”]}})
한 요소만 넣으면 그냥 검색한 것과 동일.
어레이를 검색하면 순서, 요소 수 등이 완전히 일치해야 검색이 나옴.
키.인덱스 로 찾을 수도 있음.
> db.food.find({“fruit.2” : “peach”}) >> 과일의 3번째 요소가 ‘배’ 를 찾음.

$size

> db.food.find({“fruit” : {“$size” : 3}})  >> 어레이 크기가 3인 요소.
크기의 영역을 주어 검색은 불가.. 대신 “size” or “number” 등을 같이 사용하는 것은 가능
> db.food.update({“$push” : { “fruit” : “apple”}, “$inc” : {“number” : 1}})  >> 이렇게 하고
> db.food.find({“size” : {“$gt” : 3 }})  >> 이렇게 영역 검색할 수 있음.

The $slice operator

> db.blog.posts.findOne(criteria, {“comments” : {“$slice” : 10 }})
음수는 마지막에서부터.
[23, 10] >> 23개는 스킵하고 24번째부터 34번째까지 10개 리턴.
따로 지정되지 않으면 모든 키의 값들 리턴.  다른 명령어와는 좀 다른 액션.

Querying on Embedded Documents

임베디드 다큐 쿼리의 두가지 방법 : 전체 다큐 / 각각의 키/밸류값.  >> 각각 쿼리하는 게 더 맞는 것 같네..
{ “Embeded” :  {“keyA” : “SomeValue”, “keyB” : “TheValue” }}  >> 이런 경우 다른게 끼어들거나 순서가 바뀌어도 쿼리 불능.
{“Embeded.keyA” : “Some”, “Embeded.keyB” : “blabla” }  >> 이렇게 하면 스키마가 바뀌어도 쿼리 가능.

이런 “도트” 노테이션으로 하위 문서에 접근 가능… 하지만, 도큐먼트 키에 “도트” 를 쓸 수 없다는 제약.

범위를 지정할 때… $elemMatch  –> group criteria.
> db.blog.find({“comments” : {“$elemMatch” : {“author” : “joe”, “score” : {“$gte” : 5 }}}})
임베디드 다큐 쿼리조건에서 다수의 키 사용 시… 에만 필요함.

4. $where Queries

검색이 애매한 경우 $where 절 사용하여 자바스크립트 구문을 실행하면 거의 모든 쿼리 가능. (함수형 언어 특성 ? )
어떤 두 키에 대한 값이 같은 것을 검색하는 경우.
> db.foo.find({“$where” : fundtion() {
for (var current in this) {
for (var other in this) {
if (current != other && this[current] == this[other]) { return true; }  } }
return false;
}});
스트링으로 처리 가능.
> db.foo.find({“$where” : “this.x + this.y == 10”})
느리므로 꼭 필요할 때만 사용.  각 다큐먼트는 BSON 에서 자바스크리트 객체로 컨버트 된 다음 ‘웨어’ 구문을 수행한다.
인덱스 사용 불가.
복잡한 쿼리를 하는 다른 방법은 ‘맵리듀스’..

5. Cursors

커서를 이용, find 로부터 결과를 받음.
쉐에서 커서를 만드려면, 다큐를 컬렉션에 넣고, 쿼리를 하고, 결과를 로컬변수에 할당.
> var cursor = db.collection.find();
> whild (cursor.hasNext()) { obj = cursor.next();  //  do stuff   ….  }
## cursor.hasNext() ::   cursor.next() .. fetch.
커서 클래스에서 foreach.. 루프 제공.
find 를 부르면 즉시 수행하지 않고 쿼리를 통해 질문할 때 수행함.
> var cursor = db.foo.find().sort({“x” : 1}).limit(1).skip(10);  # 이때는 수행 안함.
> cursor.hasNext()  # 이때 쿼리가 서버로 보내짐.  쉘은 처음 100개 혹은 4메가를 가져와서 디비 억세스가 잦지 않도록 함.
이 결과를 다 소진한 다음 쉘은 다음 결과를 가져옴.

Limits, Skips, and Sorts [57]

Avoiding Large Skips

Advanced Query Options

Getting Consistent Results

6. Cursor Internals

fk

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중