MongoDB

Sasha Park·2021년 4월 13일

Achievement Goals

  • NoSQL의 장점 및 특징에 대해서 이해 할 수 있다.
  • MongoDB의 도큐먼트(Document)와 컬렉션(Collection)에 대해 이해할 수 있다.
  • JSON과 BSON의 차이점을 이해하고, 도큐먼트를 가져오거나 내보낼 수 있다.
  • MongoDB의 Atlas에 대해 이해할 수 있다
  • 클러스터(Cluster)와 레플리카 세트(Replica set)에 대해 이해할 수 있다.
  • Atlas를 GUI(Graphical User Interface)와 shell 쿼리문으로 사용할 수 있다.
  • MongoDB에 CRUD를 할 수 있다.
  • Insert, Find, Update, Delete에 대한 쿼리문을 작성 할 수 있다.
  • 연산자와 프로젝션(Projection)을 사용 할 수 있다.
  • 배열과 서브 도큐먼트를 쿼리할 수 있다.
  • Aggregation Framework를 사용하여 aggregate 명령어로 쿼리할 수 있다.
  • $match, $project, $group 연산자를 사용할 수 있다.

MongoDB
Data를 table이 아닌 문서처럼 저장하는 document 형식의 대표적인 database

JSON 유사 형식으로 데이터를 문서화, 각각의 document는 컬렉션이라고 불리는 그룹으로 묶어서 관리.

NoSQL 기반의 비관계형 database의 특징

  1. 데이터 구조가 거의 없거나 전혀 없는 대용량의 데이터를 저장하는 경우
    -> 소프트웨어 개발에 정형화 되지 않은 많은 양의 데이터가 필요한 경우

  2. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
    -> 시스템이 커지면서 수평적 확장형태로 증설을 하기에 거의 무한대로 db 증설 가능

  3. 서비스를 빠르게 구축하고, 데이터 구조를 자주 업데이트 하는 경우
    -> 스키마를 미리 준비할 필요가 없어 빠르게 개발하는 과정에 유용. 시장에 빠르게 프로토 타입을 출시해야하는 경우, 소프트 웨어 버전별로 down time (db server offlice) 없이 데이터 구조를 자주 업데이트 해야 하는데 유용.

Atlas Cloud

MongoDB에서는 아틀라스(Atlas)를 사용하여 클라우드에서 데이터베이스를 설정. GUI, Shell로 데이터를 시각화, 분석, 내보내기 및 빌드에 사용 가능.

MongoDB Document

document는 객체와 같이 데이터를 field-value pair로 저장하고 구성하는 방법. 하기와 같은 form을 가지고 있음. 모든 document는 고유한 _id값을 가지고 있음. field-value 값이 같더라도, _id가 다르면 다른 document로 간주.

{ 
<field>:<value>
<field>:<value>
"name":"Sasha",
"title":"CodeMaster",
"Age" : 3
}

Document: field-value로 저장된 data
Field: data의 고유한 식별자
Value: 주어진 식별자와 관계된 data
Collection: document로 구성된 저장소. 일반적으로 문서 간 공통 필드가 있음. database는 많은 컬렉션을 가질 수 있고, 컬렉션은 많은 문서를 가질 수 있음.

JSON & BSON

Document를 shell을 이용하여 조회하거나 업데이트 할때, JSON 형식으로 출력. JSON 형식은 읽거나 쓰기 용이하지만, 텍스트이므로 parsing이 매우 느리고, 메모리 사용이 비효율적. 그래서 BSON(Binary JSON) 형식이 도입. MongoDB는 JSON 형식으로 작성된 것은 무엇이든 데이터 베이스에 추가할 수 있음. 내부적으로는 BSON 형태로 저장이 되고, 보통 읽기 쉬운 JSON의 형태로 출력.


BSON의 예

단순한 백업 저장은 BSON, 조회 및 출력은 JSON으로 기억하자.

- JSON
mongoimport
mongoexport --uri "<Atlas Cluster URI>"
  	    --collection=<collection name>
  	    --out= <filename>.json
- BSON
mongostore
mongodump --uri "<Atlas Cluster URI>"

CRUD in MongoDB

  • Create
db.collection_name.insert({data1},{data2}...)

** 여러 개의 데이터를 삽입할 경우 객체를 요소로 갖는 배열을 넣어주자. index 순으로 데이터가 삽입되며, ordered 옵션을 추가하면 삽입 순서를 변경할 수 있음.

** {"ordered": true} 일 경우, 배열 안의 index 순으로 작업이 수행됨. _id 필드 값이 같을 경우, duplicate error 발생.
  • Read
db.collection_name.find({query1, query2...})
// 데이터 중 20개만 무작위로 뽑아서 렌더링 
db.collection_name.findOne({"_id":ObjectId("")}) // 특정 데이터만 조회.

db.collection_name.find() // 전체 데이터 탐색

.pretty() // 보기 편하게 정렬
.count() // 데이터 개수 반환 
  • Update
db.collection_name.updateMany({query1}, {"$inc":{"<field>":<increment value1>,
	<field>":<increment value2>, ...}})
// $inc 연산자를 통해 다수의 필드 값을 동시에 업데이트

db.zips.updateOne({"zip":"12534"},{"$set":{"pop":6235}}) 
// $set 연산자를 통해 단일 필드 값만 업데이트

db.grades.updateOne({"student_id":250, "class_id":339}, {"$push":{"type":"extra credit", "score":100}}}) 
// $push 연산자를 통해 배열로 이뤄진 필드 값에 요소를 추가 

** field 잘못 입력할 경우, MongoDB는 새로운 데이터가 추가되는 줄 알고 업데이트하므로 주의할 것. 
  • Delete
db.inspections.deleteMany({query})
db.inspections.deleteOne({query})

db.collection_name.drop() // collection 삭제
profile
'어?' 에서 '아!'가 되는 순간을 즐기는 개발자입니다.

0개의 댓글