함께 성장하는 프로독학러

1. MongoDB 데이터 모델링, DB/Collection/Document 생성 및 제거 본문

Programming/MongoDB

1. MongoDB 데이터 모델링, DB/Collection/Document 생성 및 제거

프로독학러 2018. 5. 5. 12:02

안녕하세요, 프로독학러 입니다.


이번 포스팅에서는 MongoDB 의 데이터를 모델링하는 방법에 대해 간단히 살펴보고, MongoDB Shell 안에서 Database, Collection, Document 를 생성하고 제거하는 명령어에 대해서 알아보겠습니다.


데이터 모델링


MongoDB 의 Document 를 모델링 하는 방법에 대해서 알아보겠습니다.


이해를 돕기위해 인스타그램을 위한 데이터베이스를 모델링한다고 가정해 봅시다.


인스타그램에서 게시물을 올릴 때 필요한 정보는 다음과 같습니다.


게시글에는 사진, 설명, 작성자, 작성일이 포함되어 있다.

게시글에는 0개 이상의 해쉬태그를 가질 수 있다.

게시글에 덧글을 달 수 있다.


만약 관계형 데이터베이스를 이용한다면 table 은 총 세개가 만들어 져야 할 것입니다.

아래의 그림과 같이 말이죠.



comment, article, hashtags 테이블들은 각각의 구조(Schema)를 가지고 있고, table 안의 row 들을 이 구조를 따라야 합니다.

그리고 각 테이블의 id 의 관계성을 이용하여 세 테이블을 JOIN 시켜 한 페이지에 출력할 것입니다.


위와 같은 데이터를 MongoDB 에서 처리하려면 데이터를 어떻게 모델링 하면 될까요?

MongoDB 는 Schema-less 이므로 하나의 Collection 하위의 Document 들이 모두 같은 구조를 가지고 있을 필요가 없습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  _id: POST_ID, title: POST_TITLE,
  content: POST_CONTENT,
  author: POST_WRITER,
  hashtags: [ TAG1, TAG2, TAG3 ],
  time: POST_TIME
  comments: [
     { 
       username: COMMENT_WRITER,
       mesage: COMMENT_MESSAGE,
       time: COMMENT_TIME
     },
     { 
       username: COMMENT_WRITER,
       mesage: COMMENT_MESSAGE,
       time: COMMENT_TIME
     }
  ]
}
cs


따라서 위와 같이 하나의 Document 안에 모든 정보를 포함합니다.

Document 안에 있는 hashtags, comments 의 배열과 같은 하위의 Document 를 subdocument 라고 합니다.

만약 어떤 게시물에 태그나 덧글이 없다면 해당 필드가 없어도 상관없습니다. (Schema-less)


MongoDB 의 데이터 모델링은 한 Document (객체) 안에 모든 정보를 포함하도록 합니다.


Database / Collection / Document 생성 및 제거


이전 포스팅에서 Database, Collection, Document 에 대해서 알아보았습니다.

이들의 관계를 그림으로 표현하면 아래 이미지와 같습니다.

한 쌍 이상의 Key 와 value pair 로 이루어진 Document 들이 모여 Collection 을 이루고, Collection 들은 Database 안에 포함 되어 있습니다. 그리고 Database 는 Server 안에 위치하죠.


1) Database 생성 : use


Database 를 생성하는 명령어는 따로 존재하지 않습니다. 대신 use DATABASE_NAME 를 이용합니다.

use DATABASE_NAME 명령어는 어떤 데이터베이스를 사용할지 정하는 명령어입니다.

사용하겠다고 한 데이터베이스가 서버안에 존재한다면 해당 데이터베이스를 사용하고, 만약 존재하지 않는다면 use DATABASE_NAME 에서 언급한 데이터베이스 이름으로 새로운 데이터베이스를 하나 만듭니다.


MongoDB Shell 실행하여 mongo_tuts 라는 데이터베이스를 사용하겠다고 선언해 봅시다.


use mongo_tuts


명령어를 실행하면 switched to mongo_tuts 라는 문구가 호출됩니다.



현재 위치해 있는(사용중인) 데이터베이스를 확인하려면 db 명령어를 사용합니다.


db



현재 mongo_tuts 데이터베이스를 사용하고 있음을 알려줍니다.


서버 안의 데이터베이스들의 리스트를 확인하려면 아래의 명령어를 이용합니다.


show dbs



우리는 use 명령어를 통해 mongo_tuts 를 사용하겠다고 선언 했습니다. use 명령어를 이용하면 데이터베이스가 존재하지 않으면 해당 데이터베이스를 만든다고 했는데 서버에는 아직 mongo_tuts 데이터베이스가 존재하지 않습니다.

뭔가 잘못된걸까요?

아닙니다.

use 를 통해 생성된 데이터베이스는 그 안에 최소 한개의 Document 가 존재해야 show dbs 를 통해 확인할 수 있습니다.


mongo_tuts 데이터베이스 안에 Document 를 하나 추가해 보도록 하겠습니다.


db.book.insert({title:"book1", author:"pro-self-studier"})



*위의 명령어에서 book 은 Collection 입니다. insert 는 Document 를 추가하는 명령어인데, 이는 밑에서 자세히 살펴보도록 하겠습니다.

Document 를 추가했으니 다시 show dbs 를 통해 데이터베이스 리스트를 확인해 봅시다.


show dbs



위와 같이 mongo_tuts 가 추가 된 것을 알 수 있습니다.


2) Database 제거 : db.dropDatabase()


데이터베이스를 제거하는 명령어는 다음과 같습니다.


db.dropDatabase()


이 명령어는 use DATABASE_NAME 를 통해 지울 데이터베이스가 선택되어 있어야 합니다.



use mongo_tuts 를 이용해 mongo_tuts 데이터베이스를 선택하고, db.dropDatabase 를 이용해 mongo_tuts 를 삭제했습니다.

show dbs 를 통해 확인해 보니 mongo_tuts 이 데이터베이스 리스트에서 사라졌습니다.


3) Collection 생성 : db.createCollection()


Collection 을 생성할 때는 아래의 명령어를 이용합니다.


db.createCollection( name [, options] )


createCollection 메소드의 인자로는 name 과 options 가 들어옵니다. 

name 은 Collection 의 이름을 지정하는 인자이고, options 는 Collection 의 설정을 변경해주는 인자입니다.


Collection 을 만드는 것은 1) 에서 잠깐 살펴본 것과 같이 Document 를 생성하는 insert 메소드를 통해서도 할 수 있지만, createCollection 메소드를 이용하는 이유는 options 때문입니다.


options

Field 

Type

설명 

 capped 

 Boolean 

 capped 값이 true 이면 컬렉션 안의 Document 를 덮어씁니다. size 를 지정하면 지정한 용량보다 커지면 가장 오래된 Document 부터 덮어씁니다.

 autoIndex

 Boolean

 컬렉션 하위에 생성되는 Document 의 id 값을 자동으로 생성합니다. autoIndex 값이 false 면 자동 생성을 하지 않습니다. (3.2 버전 부터는 사라진 옵션입니다.)

 size

 number

 capped collection 일 때, 덮어쓰기를 시작할 최대 용량을 설정합니다.

 max

 number 

 해당 컬렉션에 추가할 수 있는 최대 Document 갯수를 설정합니다.


ex1 test 데이터베이스에 books 컬렉션을 옵션없이 생성


use test

db.createCollection("books")



ex2 test 데이터베이스에 articles 컬렉션을 옵션과 함께 생성


db.createCollection("articles", {

capped : true,

size : 61428000,

max : 10000

})



*DB 안에 생성된 collection 들을 조회하는 명령어 -> show collections


ex3 createCollection() 메소드를 사용하지 않고 document 를 추가하면서 자동으로 컬렉션 생성


db.people.insert({name:"pro-self-studier"})



4) Collection 제거 : db.COLLECTION_NAME.drop()


컬렉션을 제거할 때는 지울 컬렉션에 drop() 메소드를 사용합니다.


db.COLLECTION_NAME.drop()



test 데이터베이스 안의 people 컬렉션을 삭제했습니다.


5) Document 생성 : db.COLLECTION_NAME.insert()


Collection 안에 Dcument 를 추가할 때는 insert 메소드를 이용합니다.


db.COLLECTION_NAME.drop(document)


메소드의 인자로는 추가할 다큐먼트를 전달해 줍니다. 

(배열형식으로 여러개의 Document 를 전달하면 여러개의 Document 가 Collection 에 추가됩니다.)



insert 의 인자 document (객체) 를 한 개 준것과, 배열로 여러 개를 준 결과


* 컬렉션 안의 documnet 의 리스트를 확인하려면 db.COLLECTION_NAME.find() 명령어를 사용 (컬렉션 안의 모든 document 를 조회)




6) Document 제거 : db.COLLECTION_NAME.remove()


remove 메소드를 이용하면 Document 를 제거할 수 있습니다.


db.COLLECTION_NAME.remove(criteria, justOne)


메소드의 메개변수는 critera 와 justOne 이 있습니다.

critera 는 조건이라는 의미로, 객체형 데이터 타입으로 전달됩니다. remove() 메소드는 해당 조건(criteria)에 만족하는 Document 들을 삭제합니다.

* criteria 값이 빈 객체 {} 로 전달 될 경우, 해당 컬렉션의 모든 Document 를 삭제합니다.

justOne 은 optional 매게변수로 boolean 타입입니다. 기본값은 false 이며, 만약 값이 true 로 지정되면 조건을 만족하는 1개의 Document 만을 삭제합니다.



db.books.remove({author:"pro-self-studier"}) 를 통해 author 필드의 값이 "pro-self-studier" 인 Document 를 삭제했습니다.

db.books.remove({}) 를 통해 books 컬렉션 안의 모든 Document 들을 삭제했습니다.


여기까지 


MongoDB 의 DB/Collection/Document 생성 및 제거를 하는 명령어에 대해서 알아보았습니다.

다음 포스팅에서는 Document 를 조회하는 메소드인 find() 메소드에 대해서 자세히 알아보도록 하겠습니다.


**참고 자료 (항상 감사드립니다)

https://velopert.com/457


*이 포스팅이 도움이 되셨다면 다녀가셨다는 표시로 공감 부탁드릴게요! (로그인 하지 않으셔도 공감은 가능합니다 ㅎㅎ)

Comments