Intro
이번 포스팅에서는 mongoDB가 무엇인지 이론적으로 접근해 보고, 추후에 mongoDB설치 및 golang client를 사용해보는 시간을 가져보자.
mongoDB 공식문서에 정의된 mongoDB는 쉽게 개발 및 확장이 가능한 document database이다. 기존에 자주 접해왔던 Mysql과 같은 RDBMS가 아닌 NoSql기반의 document database가 무엇인지 알아보자.
1. Document Database
MongoDB의 record(RDBMS에서의 row)는 document라고 부른다. document는 "field-value" 페어로 구성되어 있으며, MongoDB의 document는 JSON형식과 비슷한 모양을 갖고 있다.
Document의 value는 값 array, document, array of document을 포함할 수 있다. 사실 mongoDB는 내부적으로 document를 BSON 형태로 저장하게 되는데, BSON은 binary형태의 JSON으로 JSON보다 더 많은 데이터 타입을 저장할 수 있다. 따라서 Document의 value는 BSON의 모든 데이터 타입을 가질 수 있다.
(BSON data type : docs.mongodb.com/manual/reference/bson-types/)
즉 위와 같은 데이터 타입을 mongoDB는 document로 가질 수 있으며, 각각의 filed가 가지고 있는 value의 데이터 타입은 아래와 같다.
- _id : ObjectId라는 객체
- name : first와 last라는 field를 갖고 있는 embedded document
- birth, death : Date type
- contribs : array of string
- views : NumberLong type
Field
document의 value가 BSON이 허용하는 모든 데이터 타입을 가질 수 있는 반면, filed는 string type만 허용한다. 그 외에도 field는 여러 제약사항이 있는데,
- field이름 "_id"는 Primary key로 예약되어 있으며, value는 collection에서 유일해야 하며, immutable이고, array타입은 사용할 수 없다.
- field이름은 null character를 사용할 수 없다.
- Top-level field 이름은 $로 시작할 수 없다. (mongoDB 3.6이상부터는 가능한듯?, 그냥 쓰지 말자, "."으로 시작하는 것도)
- BSON은 동일한 이름을 가진 두개 이상의 필드를 가질 수 있지만 mongoDB는 가질 수 없다. (굳이 해야 겠다면 docs.mongodb.com/drivers/ 여기서 드라이버 변경해야 한다고 함)
- field에 index를 생성할 거면, field이름 길이에 제한이 있다.
Dot notation
Document의 array또는 embedded document의 데이터에 접근하기 위해서 mongoDB에서는 Dot notation (점 표기법)을 사용한다.
Array
기본적으로 <array_name>.<index>의 형태로 Array의 원소에 접근한다.
- Query an Array Doc : docs.mongodb.com/manual/tutorial/query-arrays/
contribs: ["Turing machine", "Turing test", "Turingery"]
위와 같은 Array가 존재할때, 점표기법을 사용하여 "contribs.2"와 같은 형태로 3번째 원소에 접근할 수 있다. 추가적으로 오퍼에리터를 사용하여 쿼리를 할 수 있으며 자세한 예시는 다음을 참조해보자 (docs.mongodb.com/manual/reference/operator/update-array/)
- $[] : index의 모든 원소에 접근 가능
- $[/identifier/] : identifier에 의해 식별되는 원소에 접근
Embedded document
내장된 document의 데이터에 접근하기 위해서도 Dot notation을 사용할 수 있다. <embedded document>.<field> 의 형태로 접근하며,
{
...
name: { first: "Alan", last: "Turing"},
contact: { phone: { type: "cell", number: "111-222-3333" } },
...
}
- name필드의 document의 last에 접근하기 위해서는 "name.last"
- contact의 phone의 number에 접근하기 위해서는 contact.phone.number
2. Collection
mongoDB는 data를 document형태로 저장한다고 했는데, 이 document의 묶음이 Collection이다. 즉 RDBMS에서 row의 모음인 table과 일맥상통한다고 볼 수 있다.
미리 테이블의 구조를 정의해서 생성해야하는 RBDMS와 달리 mongoDB는 Collection이 존재하지 않을 때, Collection에 데이터를 처음 Insert할 떄 Collection이 생성된다.
위 사진과 같이 mongo shell에서 myNewCollection2와 myNewCollection3이 존재하지 않아도, 데이터를 삽입하면 Collection이 자동으로 맞춰서 생성된다. Collection을 명시적으로 생성할 수도 있는데, db.createCollection() 메서드와 생성시 필요한 옵션을 지정해서 명시적으로 생성할 수 있다.
Document Valication
기본적으로, Collection은 document에 대해 같은 스키마를 가질 필요가 없다. 이말은 즉 한 Collection에 포함된 document들이 같은 데이터 구조를 가질 필요가 없다는 뜻이다. 하지만 mongoDB 3.2 버전 이후로, Collection의 document schema를 강제할 수 있다. 관련 자료는 docs.mongodb.com/manual/core/schema-validation/ 여기에서 확인할 수 있다.
Document Database의 장점
- Document는 다양한 Programming Language의 native type에 잘 매칭된다.
- Embedded Document 및 Document Array를 통해 Join연산을 줄일 수 있다.
- 동적 스키마는 프로그램 개발에 있어 다형성(유연함)을 제공한다.
이런 장점들이 있다고 한다. 아무래도 RDBMS는 테이블과 같이 스키마다 고정적으로 정의되어있지만, mongoDB는 스키마를 정의하지 않고, 데이터를 삽입/삭제 할 수 있기 떄문에 프로그램 개발을 더 유연하게 할 수 있을것 같다.
'Etc > mongoDB' 카테고리의 다른 글
mongoDB 설치 및 CRUD Operation (0) | 2021.01.08 |
---|