#dokydoky

mongodb 빠르게 훑기 1 - mongodb란 본문

Programming

mongodb 빠르게 훑기 1 - mongodb란

dokydoky 2014. 6. 2. 15:04

0. 들어가며 

 안녕하세요. 김영성입니다. 이 글은 제가 공부하면서 정리한 글입니다. 부족하지만 mongodb가 뭔지, nodejs에서는 어떻게 사용하는지에 대해 빠르게 훑어보기에 적절할 것 같습니다. mongodb의 활용도, 장단점, 깊은 지식에 관해서는 잘 모르는 관계로 다루지 않습니다. 

mongodb가 대충뭔지 이해하고 mongodb의 활용에 대해 궁금하다면 아래의 문서를 읽어보는것도 괜찮을 것 같습니다.

  • Hadoop과 MongoDB를 이용한 로그분석시스템 (http://helloworld.naver.com/helloworld/1016)
  • things i wish i knew about mongodb a year ago (http://snmaynard.com/2012/10/17/things-i-wish-i-knew-about-mongodb-a-year-ago/)
  • mongodb를 쓰면서 알게 된 것들(http://bigmatch.i-um.net/2013/12/mongodb%EB%A5%BC-%EC%93%B0%EB%A9%B4%EC%84%9C-%EC%95%8C%EA%B2%8C-%EB%90%9C-%EA%B2%83%EB%93%A4/)



1. MongoDB

 1.1 Mongodb란

    • NoSQL 시스템(비관계형 데이터베이스) : 테이블끼리 아무런 관계가 없음
    • www.mongodb.org 의 mongo docs 참조.
    • 관계형DB는 관계의 무결성을 위해 성능을 희생시키는 경우가 있었음. 
    • mongodb는 관계지향적인것을 버리고 가용성을 높이고 어떤상황에서도 crash가 발생하지 않고 빠른거에 초점을 맞춤.


 1.2 mongodb 특징

  • Document-oriented storage : RDBMS의 "database > tables > rows > colums" 형태와는 다르게 MongoDB는 "database > collections > documents" 형태로 document는 key-value형태의 JSON타입으로 되어있다.
  • Full Index Support
  • Replication& High Availability : 간단한 설정만으로도 데이터 복제를 지원. 가용성 향상.
  • Auto-Sharding : 하나의 테이블에 10~20억개의 데이터가 쌓이면 인덱스가 있어도 오래 걸림. 이를 위해 RDBMS에서는 db를 분할하여 관리하는 파티셔닝을 함. 파티셔닝은 성능이슈는 해결할 수 있지만 제한적임. 이에 비해 mongodb는 처음부터 자동으로 데이터를 분산하여 저장하지만 하나의 컬렉션처럼 사용할 수 있게 해줌.
  • Querying(documented-based query) : 다양한 종류의 쿼리문 지원.
  • Fast In-Pace Updates : 고성능의 otomic operation을 지원
  • Map/Reduce : 맵리듀스를 지원.(map과 reduce 함수의 조합을 통해 분산/병렬 시스템 운용 지원)
  • GridFS : 분산파일 저장을 mongodb가 자동으로 해줌. 실제 파일이 어디에 저장되어 있는지 신경 쓸 필요가 없음. 복구도 자동
  • Commercial Support




2. Mongodb 구조


mongodb


DB


collection(RDBMS의 table개념)


document(RDBMS의 row개념)




document





collection












DB
.....











3. Mongodb 실습

mongod : 데이터베이스 데몬
mongo : mongod를 관리하는 javascript 기반 쉘프로그램
mongos : sharding 지원

mongodb는 스키마가 없다. 따라서 관계형 db에서는 db와 테이블을 미리 생성하고 데이터를 넣지만
mongodb는 쿼리문을 사용하면 바로 collection과 document가 생성된다.


database보기

show dbs


"youngsung"라는 이름의 database 선택하기(youngsung이라는 db가 생성되지 않아도 가능)

use youngsung


선택한 databases의 collections들 확인하기

show collections



"kys" collcetion에 document 생성.(선택한 db와 collection이 없다면 이 시점에 함께 생성)

db.kys.insert( {name:"aaa", age:30} )



데이터 검색하기.
조건 없이 해당 collection의 모든 document검색.

db.kys.find();


name 이 "aaa"인 document들을 검색.

db.kys.find( {name:"aaa"} );



기존의 RDBMS의 SQL문을 어느정도 아는 상태라면 아래의 사이트에서 SQL문 <-> mongodb 쿼리 변환을 보면 쉽게 사용가능.

http://docs.mongodb.org/manual/reference/sql-comparison/




4. 기타 Mongodb Q&A


{ name: {first: "John", last: "Doe"}, tall: "180cm" }


 위와 같은 document가 존재할 때. 아래의 질문을 생각해보자.

질문1) 아래의 두 update 쿼리문의 차이점은 무엇일까? 

db.things.update( {조건}, {name: {first: "Connor"}} );
db.collection.update( {조건}, {$set : {name: {first: "Connor"}}} );



질문2) 아래의 update 쿼리문의 차이점은 무엇일까?

db.collection.update( {조건}, {$set : {name: {first: "Connor"}}} );
db.collection.update( {조건}, {$set : {"name.first": "Connor"}} );


아래의 사이트를 참조하거나, 실제로 실습해보면서 답을 찾아보자.
http://stackoverflow.com/questions/11150428/updating-documents-using-nested-json-or-dotted-keys




indexing


인덱스 생성.
db.people.ensureIndex( {age:1} );


인덱스 삭제
db.people.dropIndexes( {age:1} );


age키를 unique 설정
db.people.ensureIndex( {age:1}, {unique:true} );





5. 참고자료

참고한 자료

생활코딩 mongodb 강의 ( http://opentutorials.org/course/72 )
T아카데미 강의


참고하면 좋은 자료.

node.js, mongodb 예제소스(T아카데미)
블로그(http://nashorn.tistory.com/entry/Nodejs-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%98%88%EC%A0%9C-%EC%86%8C%EC%8A%A4)
채팅(http://nashorn.tistory.com/entry/NodejsMongoDB-%EC%B1%84%ED%8C%85-%EC%98%88%EC%A0%9C-%EC%86%8C%EC%8A%A4)
MongoDB 쿼리 
http://www.slideshare.net/niddo/mongo-d-b
http://docs.mongodb.org/manual/reference/sql-comparison/
http://docs.mongodb.org   ( mongodb는 메뉴얼이 잘 되어 있음 )





Comments