MongoDB
What is MongoDB?
MongoDB의 문서 데이터 모델은 자연스럽게 JSON을 지원하며 표현 쿼리 언어는 개발자가 배우고 사용하기 쉽습니다. 자동 장애 조치(failover), 수평적 확장 및 데이터를 위치에 할당하는 기능과 같은 기능이 내장되어 있습니다.
No SQL
MySQL 과 같은 RDBMS와 다르게 MongoDB는 데이터를 저장하는 규칙인 Scheme이 존재하지 않습니다. 그렇기에 MongoDB는 RDBMS의 Table에 해당하는 Document에 데이터를 저장할때 기존에 저장했던 데이터와 관계없이 자유롭게 데이터를 저장 할 수 있습니다.
Document Oriented Database
이때 위에 언급한 Document라고하는 것은 No SQL의 하위 개념입니다. 모든 데이터를 Key - Value 형태로 저장하는 것만 약속하고 데이터를 저장하는 것을 뜻합니다. 이 약속을 통해 MongoDB는 쿼리를 제공하고 RDMBS와 같이 INDEX 을 지원합니다. 이러한 속성 때문에 MongoDB는 Document Oriented Database라고 합니다.
Json
위에서 언급한 Document의 형태는 다른 서비스에서도 보편적으로 사용하는 Json의 형태와 같습니다. Json은 JavaScript Object Notation 의 약자로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식입니다.
원래는 Javascript 언어의 객체를 표현할때 사용하는 표현식이지만, 사람과 기계 모두 이해하기 쉬운 형태이며 용량이 작기 때문에 여러 서비스에서 데이터를 표현할 때 사용하고 있습니다.
아래의 예시와 같이 기본적으로 Key - Value 형태로 표현합니다. Key값이나 문자열은 항상 쌍따옴표를 이용하여 표현합니다.
{
"employees": [
{
"name": "david",
"lastName": "lee"
},
{
"name": "tom",
"lastName": "brown"
},
{
"name": "Someone else",
"lastName": "Kim"
}
]
}
Types
Json의 value값은 아래와 같은 여러 type을 갖을 수 있습니다.
name-value
{
"firstName": "Hyungjung",
"lastName": "Lee",
"email": "lhj5772@me.com"
}
name-array
{
"firstName": "Hyungjung",
"lastName": "Lee",
"email": "lhj5772@me.com",
"tags" : ["game","platform","dev",2]
}
name-object
{
"firstName": "Hyungjung",
"lastName": "Lee",
"email": "lhj5772@me.com",
"tags" : ["game","platform","dev",2]
"job" : {
"name" : "LINE Plus",
"office" : "bundang"
}
}
MongoDB vs RDBMS
MongoDB | RDBMS |
---|---|
Document-oriented and non-relational database | Relational database |
Document-based | Row-based |
Field-based | Column based |
Collection based and key-value pair | Table based |
Gives JavaScript client for querying | Doesn’t give JavaScript for querying |
Relatively easy to setup | Comparatively not that easy to setup |
Unaffected by SQL injection | Quite vulnerable to SQL injection |
Has dynamic schema and ideal for hierarchical data storage | Has predefined schema and not good for hierarchical data storage |
100 times faster and horizontally scalable through sharding | By increasing RAM, vertical scaling can happen |
MongoDB vs Mysql
MongoDB | Mysql |
---|---|
database | database |
collection | table |
index | index |
JSON document | row |
JSON field | column |
embedding and linking | join |
_id field | primary key |
aggregation | group by |
feature
- Join이 없으므로 Join이 필요 없도록 데이터 구조화가 필요합니다 (단 유사한 lookup이 존재)
- 다양한 종류의 쿼리문을 지원(필터링, 수집, 정렬, 정규표현식 등)
- 관리의 편의성
- 스키마 없는(Schemaless) 데이터베이스를 이용한 신속 개발. 필드를 추가하거나 제거하는 것이 매우 쉬움
- 쉬운 수평 확장성
- Index 제공
Query
mongoDB 구문 | SQL 구문 |
---|---|
db.createCollection(“mycoll”) | CREATE TABLE USERS(a Number, b Number) |
db.users.insert({a:3, b:5}) | INSERT INTO USERS VALUES(3, 5) |
db.users.find() | SELECT * FROM users |
db.users.find({age:20}, {a:1, b:1}) | SELECT a,b FROM users WHERE age=20 |
db.users.find({age:20}).sort({name:1}) | SELECT *FROM users WHERE age=20 ORDER BY name |
db.contest.aggregate([{“$group” : {_id:”$job”, count:{$sum:1}}}]) | SELECT job, COUNT(*) FROM user GROUP BY job |
Architecture
Data Structure
Deploy Structure
Single Node
단일 서버에 설치해서 사용하는 방식
Replica Set
3대의 서버에 복사해서 저장하는 방식
Shard Cluster
Mongo Compass
https://khj93.tistory.com/entry/MongoDB-Window에-MongoDB-설치하기
lookup
https://secretartbook.tistory.com/20
aggregation
MongoDB는 aggregation 이라는 강력한 기능을 제공한다. aggregation에 넣는 각각의 Json Object는 Pipeline으로 동작해서 다음 Json Object에 영향을 준다. Aggregation에서 제공해주는 여러 기능을 이용해서 데이터를 조합할 수 있다.
파이프라인(pipeline) 이란, 이전 단계의 연산결과를 다음 단계연산에 이용하는 것을 의미합니다.
https://junho94.tistory.com/11
https://jaehun2841.github.io/2019/02/24/2019-02-24-mongodb-2/#group
Reference
https://docs.mongodb.com/manual/tutorial/getting-started/
Comments