🌿

3. MongoDB 구조 및 기본 명령어

 
 

1. MongoDB 시작하기

mongo
 
help라고 입력하면 mongoDB가 가지고 있는 명령어를 볼 수 있습니다.
help
notion imagenotion image
 
현재 만들어져 있는 데이터베이스 목록을 확인할 수 있습니다.
show dbs
notion imagenotion image
 
MongoDB가 특수한 용도로 쓰려고 만들어둔 데이터베이스가 있습니다.
  • admin : root 데이터베이스로 admin에 추가된 사용자는 MongoDB내의 모든 데이터베이스에 대하여 모든 권한을 획득할 수 있습니다. 서버 전역에 걸친 모든 명령어는 admin에서만 실행 가능합니다.
  • local : 특정 서버에만 정보를 보관하는 곳으로 복제가 불가능합니다.
  • config : MongoDB는 샤딩을 지원하며, config는 샤드 정보를 저장하는데 사용됩니다.
 
입력한 콘솔을 지우려면 Ctrl+L, 또는 cls을 입력하면 모든 콘솔이 지워집니다.
cls
 
실행중인 명령어를 종료하려면 Ctrl+C를 누르거나, exit을 입력하면 MongoDB shell 에서 나갈 수 있습니다.
exit
notion imagenotion image
 

2. MongoDB 구조

MongoDB의 구조는 다음과 같습니다.
WenivWeniv
Weniv

2-1. Database

Database는 컬렉션들의 컨테이너이자 가장 상위 개념으로 관계형 데이터베이스에서의 Database와 동일합니다.
 
use <데이터베이스 이름>을 입력하여 데이터베이스 생성할 수 있습니다. 데이터베이스가 존재하는 경우에는 생성된 데이터베이스로 이동하거나 전환합니다.
use db1
처음 데이터베이스를 생성할 때 적어도 하나의 문서를 데이터베이스에 생성해야 합니다. 그렇지 않은 경우에는 생성한 데이터베이스가 목록에 보이지 않습니다.
 
데이터베이스에 이동한 후, db라고 입력하면 현재 있는 데이터베이스의 이름이 나타납니다.
db
notion imagenotion image
 
현재 데이터베이스에 대한 통계를 확인할 수 있습니다.
db.stats()
notion imagenotion image
 
현재 데이터베이스를 삭제할 때에는 db.dropDatabase()를 사용합니다. 이때, 반드시 삭제하고자 하는 데이터베이스를 선택합니다.
show dbs # 데이터베이스 목록 조회 use test1 # 삭제할 데이터베이스로 이동 db.dropDatabase() # 현재 데이터베이스 삭제 show dbs # 삭제 후 데이터베이스 목록 조회
notion imagenotion image
 

2-2. Collection

각각의 컬렉션은 여러개의 수집된 문서를 저장할 수 있으며 관계형 데이터베이스의 Table과 유사하지만, 스키마를 가지고 있지 않습니다. 각 문서들이 동적인 스키마를 가지고 있기 때문입니다. 또한, 컬렉션 내의 문서는 서로 다른 필드를 가질 수 있습니다. 또한, DDL(Data Definition Language, 데이터 정의어) 작업이 필요하지 않으며, 문서를 직접 업데이트하기만 하면 됩니다.
컬렉션으로 구별해서 저장하면 데이터 지역성 측면으로 구분하기에 좋습니다. 또한, 인덱스도 효율적으로 만들 수 있습니다.
 
데이터베이스에서 컬렉션 collection1, collection2를 생성합니다. 컬렉션에 문서를 삽입하면서 컬렉션을 생성할 수 있습니다.
db.collection1.insertOne( { x: 1 } ) db.collection1.insertOne( { x: 10 } ) db.collection2.insertOne( { y: 1 } ) db.collection2.insertOne( { y: 10 } ) db.collection1.find() // 이 명령으로 값을 볼 수 있습니다. db.collection2.find() // 이 명령으로 값을 볼 수 있습니다.
notion imagenotion image
 
또 다른 방법으로는 db.createCollection()을 이용하여 생성할 수 있습니다.
db.createCollection("collection3")
notion imagenotion image
 
컬렉션을 생성할 때, 옵션을 주어 생성할 수도 있습니다.
db.createCollection("collection4",{ capped:true, # boolean size: 100000, #number max: 10000 #number })
notion imagenotion image
  • capped : true를 설정하면 capped collection을 활성화됩니다. capped collection은 고정된 크기를 가진 컬렉션으로 size를 초과하면 가장 오래된 데이터를 덮어씁니다. 이때, size값을 설정해야합니다.
  • size : 컬렉션의 최대 사이즈를 지정할 수 있습니다. 이때 단위는 Byte입니다.
  • max : 컬렉션에 추가할 수 있는 최대 갯수를 지정합니다.
 
DB안에 생성된 컬렉션 목록을 조회할 수 있습니다.
show collections
notion imagenotion image
 
컬렉션 찾는 방법은 다음과 같습니다.
db.getCollection("conllection1")
notion imagenotion image
 
컬렉션 제거하기 위해서 컬렉션이 있는 데이터베이스에서 db.collection_name.drop()을 실행합니다.
show collections # 컬렉션 목록 조회 use test1 # 삭제할 컬렉션이 있는 데이터베이스로 이동 db.conllection4.drop() # 컬렉션 삭제 show collections # 삭제 후 컬렉션 목록 조회
notion imagenotion image
 

2-3. Document

Document는 데이터를 뜻하며, RDBMS에서의 Row(혹은 튜플)과 동일합니다. JSON 형태의 key-value 쌍으로 이루어진 데이터 구조를 하나의 문서라고 보면 됩니다.
 
문서 객체는 속성들의 집합으로서 하나의 문서 객체를 만든 후, 자바스크립트 객체와 같이 속성들을 추가하여 저장할 수 있습니다.
{ "username": "홍길동", "password": "korea1", }
 
_id를 생성하고 싶으신 경우에는 아래의 코드와 같이 입력합니다.
db.collection_name.insert({_id : 1})
notion imagenotion image
 
_id를 따로 설정하지 않을 경우, 문서는 자동으로 _id를 생성하며, 값은 유일하며 기본키랑 동일합니다. 12바이트 16진수로 4byte는 현재 타임 스탬프, 3byte는 머신 ID, 2byte는 MongoDB 서버의 프로세스 ID, 3byte는 단순 증분값입니다.
notion imagenotion image
 
Document는 동적 스키마를 갖고 있기 때문에, 같은 Collection 안의 Document끼리 다른 스키마를 갖고 있을 수 있습니다. 즉, 서로 다른 데이터들을 가지고 있을 수 있습니다.
{ _id: id, username: name, age: age }
{ _id: id, username: name, age: age, hobby: hobby }
 
MongoDB는 두가지 유형의 데이터 모델이 있습니다. 예를 들어, 포스트 하나에는 댓글이 여러개가 있으니까 1대다 관계입니다. RDBMS를 썼다면 2개의 테이블로 분리시키게 되지만 MongoDB는 분리시키지 않는 대신에 포스트 내부에 댓글을 넣습니다. 이렇게 모든 관련 데이터를 단일 문서에 포함하는 것을 임베디드(비정규화) 데이터 모델이라고 합니다.
{ _id: id, title: title, content: content, username: name, tags: [ tag1, tag2, tag3 ], comments: [ { username: comment_name, mesage: comment_message, time: time }, ] }
임베디드(비정규화) 데이터 모델
 
또한, 참조를 사용하여 문서에 하위 문서를 참조하는 것을 정규화된 데이터 모델이라고 합니다.
#user { _id: 101, username: name } #user_info { _id: 102, username: 101, first_name: first_name, last_name: last_name, birthday: "0000-00-00" } #comments { _id: 103, comment_name: 101, mesage: comment_message, time: time }
정규화된 데이터 모델
 

3. 데이터 타입

  • string : UTF-8문자의 모든 문자열을 나타냅니다.
    • { "text" : "text" }
  • number : MongoDB는 64비트의 부동소수점 숫자를 사용합니다. NumberInt("숫자"), NumberLong("숫자")은 각각 4바이트, 8바이트 정수를 나타냅니다.
    • { "price" : 2000, "sale" : 0.33 } { "age" : NumberInt("20"), "number" : NumberLong("1234567") }
  • boolean : true(참) 또는 false(거짓)
    • { "status" : true }
  • arrays : 배열이나 목록 또는 여러 값을 하나의 키로 저장하는데 사용합니다.
    • { "name":["first_name":"Hong","second_name":"gildong"] }
  • null : 존재하지 않는 필드
    • { "hobby" : null }
  • Date : 1970년 1월 1일 이후의 날짜를 64비트 정수로 저장합니다.
    • { "date" : new Date() }