몽고 디비 MongoDB The Definitive Guide.. Ch. 1, 2

그동안 시간이 많았는데 블로깅 하는 걸 잊고 살았슴다. 서버 개발자 찾아 삼만리..  하다가 조금씩 공부해 보기로 작정.. 일단 언어는 파이썬.. 디비는 당근 MySQL 로 생각했었는데, 이것도 요즘 대세인 하둡, NoSQL 쪽으로 가기로.. ㅎㅎ 점점 게임과는 거리가 멀어지는 듯.. 그러다가 몽고, 카산드라 사이에서 잠깐 고민하다가… 몽고 디비에 관한 책을 와우에서 구해서.. 둘다 얇고.. 하나는 파이썬과도 통하고… 해서 당장 오늘 시작

1장. Introduction

Powerful, flexible, scalable data store.. ? 데이터 [베이스] 가 아니라 [스토어] 라고라고라?.. 맵리듀스 스타일의 압축 도 지원하고.. 다양한 특성을 갖고 있다.

A Rich data model

‘row’ 단위보다는 ‘document’ 단위로 저장하여 스키마를 변경해도 유연하게 처리 가능하다.. RDB 는 꽉 짜여진 것이고… 몽고는 좀 느슨하다는 것 같음. 하나의 레코드로 복잡한 구조를 표현 가능하다. 또한 ‘스키마-프리’. 변경할 스키마가 없으므로 대량 데이터 이동 등이 불필요. 새로운 / 사라진 키는 모든 디비를 똑같이 강제하기 보다는 어플리케이션 레벨에서 처리.  데이터 모델 진화에 유연하게 대처 가능.

Easy Scaling

데이터가 커지는데 대처하는 방법 : Scale Up (bigger machine), or  Scale Out (partitioning data across more machines) 몽고는 처음부터 스케일 아웃에 대비해 설계됨. Document-oriented data model 은 자동으로 여러 서버에 나눠 저장. 개발자는 로직에 집중할 수 있음. 저장공간이 더 필요할 때 단지 클러스터에 기계를 더 붙이고 나머지는 디비가 알아서 함.

Tons of features

Indexing :: generic secondary indexes.  geospatial indexing.. Stored JavaScript :: Instead of stored procedures, JS functions… Aggregation :: Map reduce. Fixed size collection :: capped collections .. such as logs.. File storage :: large files and meta data.

.. Without Sacrificing Speed

속도를 위한 … binary wire protocol   memory mapped files ..dynamic query optimizer

Simple Administration

설정이 적다.. ㅎㅎㅎ

2장. Getting Started.

> Document : 기본 데이터 단위.. row 에 해당.
> Collection : 테이블 ..
> 하나의 인스턴스가 여러 디비를 호스트 할 수 있음.
> 강력한 JavaScript Shell.
> _id : special key.

Documents

>   ordered set of keys with associated values  > 언어마다 다른 정의 ? 자바스크립트에서는 object

{“greeting” : “Hello, world!”, “foo” : 3 }
>> 순서가 있음.
>> 밸류는 특정 테이터 타입이 있음.
>> 키는 스트링.  은 제외.  키의 종료를 의미.   $와 . 역시 예약어.  _ 로 시작하는 것도 피할 것.
>> 타입, 케이스 센시티브 함..
>> 중복 키 금지.

Collection

Group of Documents.

Schema Free

컬렉션은 스키마-프리.
아무거나 들어갈 수 있는데, 왜 별도의 컬렉션이 필요한가?
> 종류별로 구별
> 타입을 리스트 하기보다, 컬렉션을 리스트하는게 더 빠름.
> 인덱스 ??

Naming

> “”, /0, system 으로 시작, $ 불가

Subcollection

[.] 으로 분리 (예: blog.posts) 이때 blog 와는 전혀 무관. 이름만 지음.
드라이버에서 유용한 방법 제공.
데이터를 구성하는 유기적 방법을 제공하므로 ‘강력 추천’

Databases

컬렉션으로 그루핑하고, 컬렉션들을 데이터베이스로 그루핑한다.  하나의 인스턴스는 여러 데이터베이스를 호스트 가능.  완전히 독립적으로.
데베는 독립된 퍼미션, 독립된 파일에 저장.
하나의 어플은 같은 데베에 저장을 추천. 여러 파일은 여러 어플이나 동일 몽고디비 서버의 여러 사용자일 때 .
데베는 이름으로 구별.

> “” 널문자 불가
> 소문자
> 64바이트

특별한 디비 네임.

> admin : root database.
> local :
> config :

mds 디비의 blog.posts 컬렉션이면 mds.blog.posts 네임스페이스를 얻게 됨.  네임스페이스는 121바이트 한계.

Getting and Starting MongoDB

서버로 실행됨.  => mongod  실행.
인자 없이 실행시키면 디폴트 데이터 폴더 이용. /data/db/  & port 27017. 없거나 쓰기불능이면 페일. 포트 페일도 페일. => 다른 인스턴스가 돌고 있을 때.
기본 http 서버 셋업. 28017.  관리를 http://localhost:28017 웹 브라우저로 가능.
종료 : Ctrl – C

MongoDB Shell

JS shell. 관리에 매우 편함.

Running the Shell

JavaScript interpreter 전체임.  멀티라인 가능. 문장이 끝났는지 검토.

MongoDB Client

또한  stand-alone MongoDB client 이다.  기동 시 셀은 몽고 디비의 test 디비에 연결하고 이것을 전역변수 db 에 할당함.  이 변수가 주된 접속 포인트임.
애드온. SQL shell과 유사함. 추가 함수는 없지만 나이스한 구문 제공.

> use foobar
switched to db foobar

자바 스크립트이므로 변수를 치면 변수를 스트링으로 바꿔 프린트한다.
컬렉션 역시 db 를 통해 접속 가능. db.baz 는 baz  컬렉션 리턴.

Basic Operations with the Shell

CRUD (create / read / update / delete)

Create

함수 insert 는 컬렉션에 다큐먼트 추가.

> post = { “title” : “My Blog Post” , “content” : “Here’s my post.”, “date” : new Date() }
> db.blog.insert(post)  .. 저장됨.
> db.blog.find()  확인.  “_id” : ObjectID (“asd2dbad33kj;adsfklj3kl;sd”)  이런게 추가됨.

Read

find() , findOne()  20개 다큐먼트 보여줌.

Update

두개의 인자. 어느 다큐먼트를 업데이트 할지 criteria, new document.

> post.comments = []
> db.blog.update( { title : “My Blog Post” } , post)  >> “comments” key 가 추가됨.

Delete

인수 없이 불려 모든 걸 지움.

> db.blog.remove( { title : “My Blog Post” } )  >> 요것만 지움.

Tips for Using the Shell

> help  >> built in help..
> db.help();  or   db.foo.help();

괄호 없이 함수명을 치면 뭘하는 지 알 수 있다.

> db.foo.update

Inconvenient collection names

디비 클래스의 속성만 아니면 컬렉션을 가져올 수 있다. db.version 은 디비 함수이므로 안된다. ??   getCollection 사용.
> db.getCollection(“version”);
예를 들어 foo-bar 는 유효한 컬렉션 이름이지만, 자바스크립트에서 variable subtraction 이다.
> db.getCollection(“foo-bar”)

JavaScript x.y = x[‘y’] 임.

Data Types

Basic Data Types

JSON 식. 자바스크립트와 비슷.   JSON : null, bool, numeric, string, array, object 6가지 종류.. 제한적임.  언어에 따라 다르지만 몇가지 추가함.

Numbers

몽고 디비는 4 / 8 비트 정수, 8비트 실수가 있으므로 자바스크립트를 약간 우회?해야 함.
디폴트 : 몽고에서는 모든 숫자는 더블 로 간주.   디비에서 4정수를 꺼내 가공한 후 저장하면 더블로 저장됨.
또다른 문제는 8정수가 더블로 표현되지 않음.   “floatApprox” 와  “top” “bottom” 키워드로 표현..

Dates

항상 new Date() 하라.. 객체 리턴.. 그냥 하면 스트링만 리턴.   자바스크립트 방식..  디비에는 기준 시점 이후의 밀리세컨드로 저장.

Arrays

어레이 내에 다른 타입을 가질 수 있음.  어레이를 멤버로 가질 수도 있음.
몽고는 이 구조를 이해함.  어레이에 대한 쿼리 가능..
원자적 업데이트 가능.. (하나를 바꾸는 액션)

Embedded Documents

Value 값으로 할당된 다큐먼트..   주소 : { 나라 : 콩고, 시 : 시티, 구 : 용산 } 이런식으로 표현 가능.. RDB 에서는 다른 테이블 필요하지만 몽고는 불필요
더 자연스럽게 정보를 표현.
단점 >> 정보가 반복될 수 있다.

_id and ObjectIds

어느 타입이든 가능.  각 컬렉션에는 고유한 아이디 필요.. 다른 컬렉션은 동일 아이디 가능.

ObjectIds

12 bytes. 24 hexadecimal digits.
> 4 byte : Time Stamp .. 입력 순서대로 정렬 가능..  암시적 타임 스탬프.
> 3 byte : Machine .. hash of the machine’s hostname.
> 2 byte : Process ID
> 3 byte : Incremental.  256 ^ 3 = 16,777,216 … in a single second..

Autogeneration of _id

Advertisements

답글 남기기

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

WordPress.com 로고

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

Twitter 사진

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

Facebook 사진

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

Google+ photo

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

%s에 연결하는 중