MongoDB

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

MongoDB

MongoDB

Deploy Structure

Single Node

단일 서버에 설치해서 사용하는 방식

Replica Set

3대의 서버에 복사해서 저장하는 방식

Shard Cluster

MongoDB

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) 이란, 이전 단계의 연산결과를 다음 단계연산에 이용하는 것을 의미합니다.

MongoDB

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