* MongoDB 단일 인스턴스는 여러 독립적 데이터 베이스를 가진다
* 데이터 베이스는 자체적인 컬렉션들과 권한을 가진다.
* 컨렉션은 스키마가 없는 테이블과 같다
* 컨렉션에서 데이터의 기분 단위는 문서이며 고유의 특수 키 "_id"를 가진다.
* MongoDB는 인스턴스 관리와 데이터 조작에 유용한 단순하지만 강력한 자바스크립트 쉘을제공한다.

1. 문서 고유의 키 "_id" 에 대하여
-  "_id" 키는 어떤 데이터 형이 될 수도 있지만 ObjectId 형이 기본이 되며 하나의 컬렉션에서 각 문서가 고유할 수 있도록 "_id" 키는 unique 해야 한다.
- ObjectId는 12바이트 저장소를 사용한다. 각 바이트는 다음과 같이 생성된다

 * Timestampsms 1970년 1월 1일 이후 초단위 타임스탬프
 * Timestamp가 기록됨으로 ObjectId는 대략 입력 순서대로 정렬 되며 100% 보장되지는 않지만 효율적으로 색인되기에 좋은 속성이며 각 문서가 언제 생성되었는지를 알려 준다.
- 문서가 삽입 될 떄 "_id"키가 없으면 해당 문서에 자동적으로 추가되며 일반적으로 클라이언트 쪽의 드라이버가 처리한다. (클라이언트까지 분산 확장)

2. 데이터 형
 - MongoDB는 JSOB 의 키/값 쌍을 그대로 유지하면서 추가적으로 다음의 데이터 형들을 지원한다.
 1) null 형 : {"x" : null}
 2) boolean 형 : 'true'와 'false'로 표현되는 값 {"x" : true}
 3) 32비트 정수형 : 쉘에서는 표현 불가, 32비트 정수형은 부동소수점형으로 변환
 4) 64비트 정수형 : 쉘에서 표현 불가, 이 값을 특별한 내장 문서로 통해 표현
 5) 64비트 부동소수점형 : 쉘 내 모든 숫자는 이 데이터형이다. {"x" : 3.14 } , {"x" : 3}
 6) 문자열형 : 모든 UTF-8 문자열 {"x" : "foobar"}
 7) 심볼형 : 쉘에서 지원 불가, 데이터베이스에서 심볼형을 받게 되면 쉘에서 문자열로 변환
 8) 객체 ID 형 : 객체 ID 형은 고유한 12바이트 ID 임 {"x" : ObjectId() }
 9) 날짜형 : 1970년 1월 1일 이후의 시간 흐름을 1/1000 초로 저장함 {"x" : new Date()}
 10) 정규표현식형 : 자바스크립트 문법의 정규 표현식을 포함함 {"x" : /foobar/i}
 11) 코드형: 문서는 자바스크립트 코드도 포함 가능하다 {"x" : function() {/* ... */}}
 12) 이진 데이터형 : 임의의 바이트 문자열로 쉘에서는 조작이 불가함
 13) 최대값형: BSON 은 가장 큰 값을 나타내는 특별한 데이터 형이 있음, 쉘에서는 이것에 대한 데이터 형이 없음
 14) 최소값형: BSON 은 가장 작은 값을 나타내는 특별한 데이터 형이 있음, 쉘에서는 이것에 대한 데이터 형이 없음
 15) undefined : undefined 정의 {"x" : undefined}
 16) 배열 : 값의 집합 또는 목록을 배열로 표현 가능 {"x" : ["a","b","c"]}
 17) 내장 문서 : 부모 문서에 값으로 내장되는 문서 {"x" : {"foo" : "bar"}}
- [숫자에 대해] 
  * MongoDB 는 세가지 숫자형을 지원하지만 쉘은 자바스크립트 제약을 피해서 표현한다. MongoDB의 쉘은 모든 숫자는 Double 형으로 취급한다. 데이터베이스에서 4바이트 정수를 불러온 후 그 정수 형을 바꾸지 않고 문서를 조작해 데이터베이스에 저장하면 부동소수점형으로 저장되기 때문에 쉘에서 문서를 덮어쓰지 않는 것이 좋다.
 * 더블형으로 표현될 경우 8바이트 정수형 숫자를 8바이트 플롯형으로 정확하게 표현하지 못하게 된다. 8바이트 정수형은 쉘에서 근사치를 내장 문서로 보여 준다. 예를 들어 64비트 정수 3을 저장하면 다음과 같이 표현된다.

{
     "_id" : OjectId("............"),
    "myInteger" : {
    "floatApprox" : 3
    }
}

만약 더블형으로 정확하게 표현이 불가능한 8바이트 정수를 삽입하면 쉘은 32비트 정수를 구성하는 높은 자리 수 4 바이트와 낮은 자리 수 4바이트를 나타내는 "top"과 "bottom"이라는 두 키로 보여준다. 다음은 9223372036854775807 을 삽입할 경우 보여지는 예이다.

{
   "_id" : OjectId("............"),
   "myInteger" : {
   "floatApprox" : 9223372036854776000,
   "top" : 2147483647,
   "bottom" : 4294967295
   }
}
 - [날짜에 대해]
 * 자바 스크립트의 날짜 객체를 이용한다. 날짜는 new Date(0를 써야 한다. (왜냐하면 Date()를 하게 되면 날짜의 문자열 표현을 반환) 데이터베이스에서는 1970년 1월 1일 이후 시간 흐름을 1/1000 초 단위로 저장함
- [배열에 대해]
 * 리스트, 스택, 큐와 같은 정렬 연산과 셋과 같은 비정렬 모두 쓸 수 있는 값들로 MongoDB 가 배열의 구조를 '이해'하고 배열의 내용 물을 어떻게 '안에서 꺼내어' 연산해야 하는지 알고 있다. 배열에 쿼리하고 그 내용물을 써서 색인을 만들 수 있다.
- [ 내장 문서]
 * 내장 문서는 다른 문서 내 키의 값으로 쓰이는 MongoDB 문서 전체를 뜻한다. 배열과 마찬가지로 MongoDB 는 내장 문서의 구조를 '이해'하며 그것들의 내용물을 '안에서 꺼내어' 색인을 만들고, 쿼리를 실행하며, 또는 갱신이 가능하다.

3. 문서
 - MongoDB의 핵심은 정렬된 키와 연결된 값의 집합으로 이루어진 문서에 있다. 문서의 키 값의 쌍은 정렬되어 있다. {"foo" : 3, "greeting" : "HW" }와 {"greeting":"HW", "foo":3"}은 다른 문서이다.
 - 문서의 키는 문자열형 으로 다음의 예외를 제외하고는 어떤 UTF-8도 문자로 이용 가능하다.
   * 키는 \0(null) 문자를 포함하지 않으며 이 문자는 키의 끝을 나타낸다.
   * .과 $ 문자는 몇가지 특별한 속성을 가지고 있어서 특정 상황에서만 사용해야 한다.
   * 엄격하지 않지만 _ 로 시작하는 키는 예약어로 생각하는 것이 좋다.
- 키는 중복 될 수 없다. {"greeting" : 'HW " , "greeting" : "HM"} 는 잘못된 문서임

4. 컬렉션
 - 컬렉션은 문서의 모음이다. (RDB의 테이블로 보면 됨)
 - 컬렉션은 스키마가 없다. 즉 컬렉션 내 문서들이 모두 다른 구조를 가질 수 있다. 그럼 스키마가 없는데 왜 하나 이상의 컬렉션이 필요한가?
   * 같은 종류의 문서는 하나의 컬렉션에 놓는 것이 관리상 좋다.
   * 각 컬렉션별로 목록 뽑기가 한 컬렉션 내 특정 데이터형별로 쿼리해 목록을 뽑을 때보다 빠르다.
   * 데이터의 지역성을 향상 시켜서 디시크 탐색 시간이 짧아 진다.
   * 컬렉션헤 단일한 데이터형의 문서를 넣게 되면 보다 효율적으로 색인을 생성 가능하다.
 - 컬렉션은 이름으로 식별하며 다음의 예외를 제외하고는 어떤 UTF-8 문자도 이용 가능하다.
   * 빈 문자열("")은 유효한 컬렉션 이름이 아니다.
   * \0 은 컬렉션 이름의 끝을 나타내며 컬렉션 이름으로 사용 불가하다.
   * system 으로 시작되는 컬렉션 이름은 시스템 컬렉션의 예약어로 사용이 불가하다.
   * 사용자가 만든 컬렉션 이름에 $ 문자를 사용할 수 없다.
- 컬렉션을 체계화하기 위해서 서브 컬렉션의 네임 스페이스로 .을 이용 가능하다. blog.posts 와 blog.authors 라는 컬렉션을 만들 수 있으나 각각은 아무런 관계가 없다. 심지어 blog 컬렉션과도 관련이 없다. 하지만 MongoDB의 데이터를 체계화 할 수 있는 방법으로 사용을 권장하는 편임
  * 큰 파일들을 저장하는 프로토콜인 GridFS 는 콘텐츠 데이터와 별도로 메타데이터를 저장하기 위해 서브 컬렉션을 이용함
  * MongoDB 의 웹 콘솔은 서브컬렉션으로 DBTOP 섹션의 데이터를 체계화함
  * 대부분의 드라이버는 특정 컬렉션의 서브 컬렉션에 접근을 지원하는 몇가지 문법적 편리함을 제공함.

5. 데이터베이스
- MongoDB의 단일 인스턴스는 여러 데이터베이스를 호스팅 가능하며, 각 데이터베이스를 완전히 독립적으로 취금 가능하다. 하나의 데이터베이스는 자체 권한을 가지고 있으며 따로 분리된 파일로 디스크에 저장된다.
 - 데이터베이스는 이름으로 식별한다. 다음의 예외를 제외하고는 어떤 UTF-8 문자열도 쓸 수 있다.
   * 빈 문자열 ("")은 유효한 데이터베이스 이름이 아니다.
   * 데이터베이스 이름은 다음의 문자를 포함할 수 없다. ''(공백문자), ., $, /, \0(null문자)
   * 데이터베이스 이름은 모두 소문자이어야 한다.
   * 데이터베이스 이름은 최대 64바이트이다.
- 실제 데이터베이스 이름은 파일 시스템 상에서 파일이 된다.
- 직접 접근 가능하지만 특별한 의미가 있는 다음의 예약된 데이터 베이스도 있다.
  * admin : 'root' 데이터베이스이다. 모든 데이터 베이스 목록 조회, 서버 중지 등 서버 전역에 걸쳐 실행하는 명령어들은 admin 데이터 베이스에서 실행 가능하다.
  * local : 이 데이터 베이스는 절대로 복제되지 않기 때문에 특정 서버에만 저장하는 컬렉션에 사용됨
  * config : 샤딩 설정 정보 저장에 사용
저작자 표시
신고
Posted by alias


티스토리 툴바