이번 포스팅에서는 CRUD operation에 대해서 개괄적으로 이야기해볼 생각이다. 개괄적으로다. 너무 자세하게 하는 것은 어짜피 메뉴얼만 못 하므로 개괄적으로 이야기해보려고 한다. 이야기하다가 중요한 개념이 있다고 생각하면 그 부분은 그래도 꼭 언급하고 갈터이니 그렇게 걱정하지 않아도 된다.


CREATE operation

MySQL과 MongoDB에서 다른 것 중 하나가 Create operation이다. MySQL 에서는 CREATE DATABASE ... 와 같이 테이블 생성을 위한 명령어가 따로 있는가 반면, MongoDB는 unstructured, schema-free database이기 때문에 굳이 Schema를 정하는 과정이 필요 없다. 따라서 사용하고 싶은 데이터베이스의 이름을 정해서 use 명령어를 Mongoshell에 입력하면 된다.


'show databases' 명령어를 통해 데이터베이스가 생성되어있는지 확인을 하면 life database가 생성되어있지 않는 것을 확인할 수 있다. 


database를 실제로 생성하려면 하나 이상의 document를 가진 collection이 최소 한 개 이상 있어야 한다. 


CREATE collection

그러면 한번 만들어보자. collection 을 생성하는 것 역시 schema-free 이기 때문에 특별한 명령어가 없다.MySQL에서는 CREATE TABLE ... 과 같은 명령어가 있지만 MongoDB는 그렇지 않다. 따라서 그냥 insert함수를 써서 collection에 document를 삽입해주면 된다. 아래와 같다.


document를 세 개 이상 삽입하고 싶으면 아래와 같이 array 형식으로 바꿔서 삽입해도 된다.


지금 'show dbs'  명령어를 다시 실행시켜보면 life database가 생성되어있는 것이 확인된다.


READ operation

MongoDB에서 document를 query하기 위해서는 find operation을 사용하면 된다.


# insert() definition, docs.mongodb.org
db.collection.find(<criteria>, <projection>)
<criteria> : Optional, Should be document type
<projection> : Optional, Should be document type


위와 같이 사용할 수 있다. 아래에 몇가지 예시를 들어보면 조금 더 이해가 쉬울 것이다.


# without <projection>

※ $gt는 query operator이다. 아래에 다른 query operator도 설명할 것이니 참고하면 된다.


# with <projection>

※ _id field는 자동으로 1로 세팅된다. 따라서 _id field를 보고 싶지 않을 때는 _id:0과 같이 손수 명시를 해주어야 한다.


# query operator
$gt       Matches values that are greater than the value specified in the query.
$gte     Matches values that are greater than or equal to the value specified in the query.
$in       Matches any of the values that exist in an array specified in the query.
$lt        Matches values that are less than the value specified in the query.
$lte      Matches values that are less than or equal to the value specified in the query.
$ne      Matches all values that are not equal to the value specified in the query.
$nin    Matches values that do not exist in an array specified to the query.


find() operator는 cursor를 return 한다. cursor가 무엇이냐? find()의 결과에 대하나 pointer라고 생각하면 된다.


UPDATE operation

UPDATE문은 아래와 같은 구문으로 사용할 수 있다.


# update() syntax

db.collection.update(query, update, options)
<query> : Same as query operator of find()
<update>: Update operator is given below.
multi     : Optional. Modify every document that matches to <query>. Set as fault by default
upsert   : Optional. Create document when no query is matched. Set as fault by default
writeConcern : Optional.


update operator에 대한 예시는 아래의 그림을 통해 확인하자.


"PS Lee" document의 age key에 3을 더하라는 명령어다. $inc라는 update operator를 사용했다. 아래에 더 많은 update operator가 소개되어 있으니 참고하길 바란다.


# update operator, docs.mongodb.org
$currentDate          Sets the value of a field to current date, either as a Date or a Timestamp.
$inc                           Increments the value of the field by the specified amount.
$max                         Only updates the field if the specified value is greater than the existing field value.
$min                          Only updates the field if the specified value is less than the existing field value.
$mul                          Multiplies the value of the field by the specified amount.
$rename                   Renames a field.
$setOnInsert           Sets the value of a field if an update results in an insert of a document. Has no effect on update operations that modify existing documents.
$set                            Sets the value of a field in a document.
$unset                       Removes the specified field from a document.


update() operator에서 multi option은 매칭되는 모든 document에 대해서 update를 적용시키도록 하는 option이다. 일반적으로 생각하기에 '당연한거 아니야?' 라고 생각할 수 있는데 MongoDB는 당연하게 설정되어있지 않드라.


DROP operator

drop() 함수를 통해 collection을 drop할 수 있다. 

db.collection.drop()과 같이 사용할 수 있고 parameter를 사용하지 않는다.


Delete operator

특정 document를 삭제하려고 한다면, delete()함수를 쓰면 된다.

# delete() syntax

db.collection.delete(<query>, {justOne, writeConcern})
<query> : document type. Same as query operator of find()
justOne : boolean type. Update operator is given below.
<writeConcern>: document type

휴 간단하게 CRUD는 끝내버리자.훨씬더 자세하게 쓸 수 있지만 굳이 적지는 않겠다. 내가 manual보다 잘 쓸 자신은 없고 manual을 보면서 연구하는 것이 조금 더 IT하는 사람다운 접근이기 때문이다. 


MongoDB 포스팅을 하기로 했으므로 계속 할 생각이지만, 다른 분석 포스팅들보다는 대략적으로 사용법만 언급하겠다. 물론 중요한 개념, aggregation, mapreduce, index 등등의 부분에 한해서는 나만의 디테일함을 보여주겠다!!


이번 포스팅은 여기서 마치고 다음 포스팅은 index나 aggregation 관련이지 않을까 싶다. 마지막으로 Reference로 Mongodb manual 링크를 남겨둔다. 아래의 문서를 보고 연구하며 MongoDB를 배워보자.


Reference

http://docs.mongodb.org

Posted by 빛나유

댓글을 달아 주세요

  1. humongousdb 2014.11.18 08:45  댓글주소  수정/삭제  댓글쓰기

    MongoDB 의 CRUD 에대해 잘 정리하신 글 같습니다.

    잘 읽었습니다.

MongoDB를 시작한 이유는 Big Data를 어떻게 공부할지 전혀 감을 잡지 못 하는 상황에서 뭐라도 해보자라는 이유였다. 사실 뚜렷한 목적을 가지고 공부했다기 보다는 한번 부딪혀 보자 라는 생각으로 시작했다. 그런데 꽤나 재밌다. 아무튼 MongoDB가 어떤 Database인지부터 설명해보자. 공부한지 그렇게 오래된 것은 아니므로 딱히 이전 포스팅에서 보여줬던 디테일함은 부족할 수도 있다. 공부를 하면서 조금씩 수정해나갈 생각이다.


MongoDB는 기존의 Database와는 Schema라는 개념에서 다르다. 기존의 MYSQL에서는 Schema라는 개념이 있어서 테이블 생성 시 특정 Field를 체워주거나 그 Field의 data type 등에 대한 제약이 많았다. 가령, Fruit이라는 Field의 Data type이 STRING일 경우, Fruit에 1이나 0 과 같은 숫자는 들어갈 수 없다. MongoDB는 Schema-Free database이다. 즉, Schema가 없다. 


위의 그림은 MongoDB를 통해 data를 삽입한 후 결과를 확인해본 것이다. fruit이라는 field에 apple이라는 값을 넣었는데. integer 값인 1도 들어간다. 실제로 db.test.find()를 통해 확인 한 결과 fruit이 "apple"이라는 string과 1이라는 integer를 같이 가지고 있는 것을 확인할 수 있다. MongoDB 명령어에 대해서는 후에 자세하게 설명하고 지금은 그냥 "그런 명령어이겠거니~" 하고 넘어가주면 감사하겠다. 참고로 MongoDB에서는 Field라는 개념을 쓰지 않으나 이해를 위해 이번만 Field라는 단어를 사용하겠다. 


여기서 그러면 생각나는 질문이 있다. 왜 이렇게 data의 일관성에 어긋나게 했는가이다. 이것에 대한 대답은 나도 모른다. 그런데 아주 조금 공부해보면서 추측한 이유는 Flexibility를 위함이 아닌가 싶다.


MongoDB는 DB의 Performance를 향상과 Flexibility 향상에 그 목적을 둔 언어로 알고 있다. 따라서 MongoDB는 많은 Programming Language와 연동가능 하다. 지금까지 살짝 공부했던 바로는 Python을 통해 mapreduce를 각종 다양한 코드를 사용하여 구현할 수도 있다. 


MongoDB를 공부하는 이유가 여기서 하나 더 나오는데, Mapreduce를 이용하여 Data Mining을 공부해보기 위함도 있다. 아무튼 MongoDB Fundamental을 한번 공부해보자. 


SQL에서는 row, field, tuple 등의 개념이 있다. MongoDB는 database라는 개념을 빼고는 기존의 SQL과 다르다. MongoDB도 여러 개의 database를 가질 수 있다. 


각각의 DB는 아래와 같이 여러 개의 Collection으로 이루어져 있다. MYSQL에서의 Table로 생각하면 된다.


각각의 Collection은 여러 개의 Document로 이루어져 있다.


하나의 중괄호로 열리고 닫힌, 저것들 한 줄 한줄이 각각 document이다. 위의 Collection1은 두 개 이상의 Document를 가지고 있는 샘이다. 각각의 Document는 여러 개의 Key-Value Pair의 집합이다.


위에서 MongoDB Field라고 설명을 했는데, 사실 MongoDB에서는 Field라는 개념을 사용하지 않고 Key라는 개념과 그에 상응하는 Value을 사용한다. 위의 Collection1의 각각의 Document들은 결국 name, year, job, age라는 key와 각각 "jinki", 3, "IT", 29라는 값을 가지고 있는 샘이다. 


"name":"jinki"

"year":3

"job":"IT"

"age":29


위의 네 줄이 각각 key-value pair이다.


MongoDB는 여러개의 Data Type을 가지고 있다. 위에서는 그 중에 2개인 string과 integer만을 나타내고 있다. MongoDB가 가질 수 있는 Data Type은 Date() object를 이용한 날짜 값도 있고, Javascript를 이용한 Code도 될 수 있다.(이 부분은 이후의 포스팅에서 다뤄볼 생각이다) 그 외에도 여러가지가 있다. 하나하나를 각각 설명하기보다는 MongoDB Manual을 보면 자세히 잘 나와있다. 


이번 포스팅은 뭔가 매우 짧다. 사실 길 이유가 없다. 아직 내가 아는 것도 얼마 없고 간단한 Fundamental과 소개일 뿐이니까. 매우 부족한 것이 많은 포스팅이기 때문에 앞으로 이 포스팅은 조금씩 조금씩 수정해나갈 생각이다. 지금 전부 쓰기에는 모르는게 좀 많은 것 같다. 


다음 포스팅에서는 MongoDB CRUD, 즉 Create, Read, Update, Delete 하는 방법과 Query 명령어도 알아볼 생각이다.

Posted by 빛나유

댓글을 달아 주세요

그렇다. MongoDB를 공부해보려고 한다. (사실 이미 어느 정도는 했다.)

MongoDB를 공부하려는 이유는 사실 딱히 없다. 요즘 Big Data에 관심을 많이 가지고 있으면서도 도대체 어떤 부분을 어떻게 공부해야하는지 전혀 갈피를 못 잡고 있는 상황이다. Big Data를 잘 알고 계시는 분이라면 '이거는 잘못된 시작이야' 혹은 '그렇지!! MongoDB부터 시작하는 거 좋지' 뭐 여러가지 의견이 있으실 거다. 


하지만, 나는 아직 주변에 그것에 대한 조언을 들을 만한 사람이 없다. 사실 원래 나는 혼자 내버려졌을 때 더 잘한다. 그러니까 이번에도 혼자 한다. 내가 비록 Big Data에 대해서는 잘 알지도 못 하고 어떤 식으로 시작해야 하는지 알지도 못 하지만, Better than do nothing. 가만히 있는게 아니라는 것 만은 제대로 알고 있다. 무엇이 되었든 시작하자.


원래 나같은 경우 Big Data라는 새로운 분야를 공부할 때는 Big Data의 개념부터 설명하면서 시작하곤 한다. 그런데 이번에는 그 규칙을 조금만 어겨보자. Big Data의 개념을 설명하기에는 내가 아는 것이 너무 적기 때문이다. 단편적이지만 조금씩 조금씩 포스팅 → 공부  포스팅  공부하면서 어느 정도 Big Data의 개념이 잡힌다면 그 때 설명해도 늦지 않다고 생각한다.


MongoDB 공부. 시작합니다.

Posted by 빛나유

댓글을 달아 주세요