MongoDB & Python Niall O’Higgins Ch 3, 4

Ch 3. Common MongoDB and Python Patterns

A Uniquely Document-Oriented Pattern : Embedding

RDBMS 의 join 과 같은 역할.
임베디드 다큐도 다큐와 똑같이 작업 가능.
한 키의 다수의 임베디드 다큐는 특히 유용. 즉, 값이 어레이인 속성. ;; 문법에 맞고 매우 유용한 구조.
일-다 관계 표현하는 자연스런 방식. 또는 부모-자식 관계.
한 유저의 ‘여러’ 이메일.. 일반디비에서는 2개의 테이블. 그리고, ‘조인’
몽고에서는 키와 상응하는 이메일들의 어레이..
[.] 기호를 통해 하위 값 가져오기 가능.  즉, dbh.users.find_one( { “emails.email” : “abc@kin.com” } ) .. 이런식.

이 외에도 $pull, $push .. 제공.. atomic append, removal of  sub – documents…
어떤 이메일이 더이상 유효하지 않을 때.. 다큐를 찾아서, 고쳐서, 업데이트 .. 해야하지만,  번거롭고 레이스를 불러올 수 있음.
섭-다큐의 3가지 주 작업 : 삭제, 삽입, 수정..

dbh.users.update ( { “username” : “thename” } ,
{ “$pull” : { “emails” : { “email” : “erse@the.com” } } } , safe=True)

이 소스는 다큐를 찾아내서 어레이에서 atomic fashion 으로 제거하여 레이스 원천봉쇄.
쿼리로 $pull 을 이용 가능.  예를 들어 어떤 조건이 맞는 모든 섭-다큐를 지울 때..
즉.. dbh.users.update ( {“username” : “thename”},
{ “$pull” : { “emails” : { “primary” : { “$ne” : True }}}, safe=True)

atoms 를 갖는 어레이에 적용 가능.  임베디드 다큐 ‘만’ 갖고는 작동 안함.

푸쉬는 어레이에 요소 atomically 추가할 때 사용. 끝에 추가하는 것만 가능.  <어레이의 처음에 추가하거나 임의의 장소에 넣는 업데이트 기능은 없음>
조건문이 없어서 간단함.

new_email = {“email”:”fooemail4@exmaple4.com”, “primary”:False}
dbh.users.update({“username”:”foouser”},
{“$push”:{“emails”:new_email}}, safe=True)
==> # 기존의 섭 다큐를 업데이트..  => positional operator [ $ ] 를 통해 가능.
예 :: {“$set”:{“emails.$.primary”:False}}, safe=True)
>>*<< 업서트 에서 사용 불가, first matched element 에서만 가능.

__ Page 29 __
<1> 임베딩 관련 작업 시, 다큐, 섭-다큐의 성능을 아는 것이 중요. 쿼리에 의해 다큐먼트가 불려오면 섭 다큐 등 모두가 메모리에 로딩됨.
즉, 임베디드 데이터를 가져오는 데 추가의 자원이 필요 없다.. (인코딩 cpu 같은 거 제외하고)
최상위 다큐먼트가 가용상태면 섭-다큐는 즉시 가용함.  이것을 ‘조인’에서는 여러 테이블을 읽으므로 성능이 떨어짐.
<2> 몽고에는 크기 제한이 있지만, 버전 따라 커지고 있음. 1.8 은 16메가.  시간에 따라 커지는 데이터가 아니고서는 충분함.
댓글을 다는 경우.. 한 다큐에 있을 때.
__ To embed , or not to embed. _ _ _ _ _ ^^
임베딩의 대안 >> 다큐를 분리된 컬렉션에 저장.  어플에서 조인하는 코드 구성.
보통 >>> 다 : 다  관계는 이렇게 조인..
보통 >>> 일 : 다  관계는 임베드.

Fast Lookups : Using Indexes in MongoDB [p31]

인덱스의 역할은 관계형디비와 크게 다르지 않음.  두가지 제공 : Btree indexes & geospatial indexes.
Btree 는 MySQL 등과 유사.  관계형 시스템에서는 빨리 찾기 위해 인덱스 이용, 몽고에서는 의미상 인덱스를 컬렉션의 특정 속성에 사용.
몽고는 여러 필드로 인덱스 확장 가능. (a.k.a. compound indexes)  한개 이상의 속성에 기반하여 쿼링하는 것을 미리 알고 있을 경우에 유용.
예 > 성, 이름으로 쿼링할 때.
몽고에서 비트리 인덱스는 “방향”을 가질 수 있음.  컴파운드 인덱스에서만 유용. 성능을 위해 쿼리와 소팅의 방향이 매칭되야 함.
비트리 인덱스는 데이터에 앞서 인덱스를 업데이트해야 하므로 쓰기 퍼포먼스에 타격. 인덱스를 조심히 선택해야 함.
Superfluous indexes를 피할 것.
인덱스는 스토리지도 차지함.   메모리 역시.   전형적인 <시간 대 공간 트레이드 오프> 시나리오임..
비트리는 컬렉션에 특별한 제한을 가할 때도 사용.
비트리는 값이 어레이인 경우도 지원. 어레이의 각 아이템은 인덱스에 적당히 저장되서 다큐의 빠른 조사가 가능. 태깅 기능에 유용.
비트리는 임베디드 다큐도 지원.   예> 이메일을 섭 다큐로 지정하고 인덱스로 사용할 때.
서버 쪽 소팅 퍼포먼스에도 중요. 4메가 이상의 결과에 대해 소팅하려고 할 대 소트 키에 인덱스를 지정해야 함.  개발시에는 예상치 못한 거대한 실제 데이터에 대해 쿼리할 때 예외를 발견하는 것을 간과하기 쉽다.

파이 몽고 드라이버로 인덱스 생성.
Collection.create_index()  # method  single-key OR compound (튜플) indexes 생성.
dbh.users.create_index([(“first_name”, pymongo.ASCENDING), (“last_name”, pymongo.ASCENDING)]) # 리스트로 인덱스 생성 예.
인덱스에는 자동 이름이 붙지만 커스텀 네이밍 가능
dbh.users.create_index([(“first_name”, pymongo.ASCENDING), (“last_name”, pymongo.ASCENDING)], name = “myIndex_name”) # 커스텀 이름.

인덱스를 만들면 기본으로 디비를 ‘잠군다’. 큰 컬렉션에서 시간이 걸리므로. 백그라운드에서 생성 가능. 당연히 시간은 좀 더 걸리지만 디비가 ‘가용’ 상태.
dbh.user.create_index(“username”, background-True)

Unique constraint..  unique=True
유니크 옵션은 몽고에서는 관계디비와는 다름.  첫번째를 제외하고 중복 요소 제거.. dropDups = True

인덱스 제거는 쉽다. drop_index() method.

Collection.index_information() # Python .. 인덱스 조사.   Dictionary 리턴.  인덱스 이름 = 키, 밸류 = 또다른 딕셔너리.
이 딕셔너리는 key ..로 불리는 ‘키’ 를 포함. 인덱스 방향 포함한 원래 인덱스 specifier.   create_index에 넘겨진 것.   옵션들도 포함.

Location-based Apps with MongoDB : GeoSpatial Indexing [p33]

Points of interest (POI)

몽고는 Gustavo Niemeyer 가 개발한 geohasing 알고리즘 사용.
현재로서는 포인트-베이스 쿼링만 가능.
$near $within $box $circle $polygon (MongoDB v 1.9)
GPS 좌표만 가능 (-180 ~ 180 )
파이썬 딕셔너리는 순서가 없으므로 bson.SON 을 이용할 것.

인덱스는 하나의 위치인덱스만 포함 가능.. 다른 것과 같이 컴파운드 인덱싱 가능.

$near :: 기본으로 100개 결과 리턴. 최대값 지정 (5도 정도가 적당) 1도 = 69마일.
$nearSphere $centerSphere :: radian.

Code Defensively to Avoid KeyErrors and Other Bugs [p37]

Update-or-Insert: Upserts in MongoDB

save() : _id 없이 실행하면 새로운 다큐 삽입, _id 가 있으면 업데이트.  ;; 업서트 ..

업데이트는 두가지 경우를 각각 수행함. 문서가 있으면 업데이트 하고, 없으면 새로 만든 후에 업데이트를 실행함.

Atomic Read-Write-Modify : MongoDB’s findAndModify [p40]

업데이트 결과를 가져올 때.. 레이스 컨디션 회피 명령어.

Fast Accounting pattern

점수, 랭킹 계산의 경우.. 데이터 크고, 빠르게 계산 필요.

 

 

Ch 4. MongoDB with Web Frameworks

Pylons 1.x and MongoDB

WSGI-based web frameworks. 2005 09.  v1.0 at 2010
“one-size-fits-all”  < — > Pylon
So modular.. easy to add MongoDB

Pyramid and MongoDB

Pylons 2.0 ..
scaffold ..

Django and MongoDB

Mango..
10gen .. sample app.

2013. 2. 23.

 

Advertisements

답글 남기기

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

WordPress.com 로고

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

Twitter 사진

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

Facebook 사진

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

Google+ photo

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

%s에 연결하는 중