SlideShare a Scribd company logo
1 of 154
Download to read offline
MongoDB로 배우는 NoSQL

                       채수원
             blog.doortts.com
           doortts@gmail.com
진행목표

             - 쉽게
             - 학습 시간 단축
             - 기초를 닦아서 발판을 마련
             - Use ME!!




2                       MongoDB로배우는NoSQL
NoSQL




3           MongoDB로배우는NoSQL
Think about DATABASE




4              MongoDB로배우는NoSQL
in recently

•           충분히
•           필요한 만큼
•           적절하게
•           잘 살아오고 있었다.




1983, DEC microcomputer (128kb ram)
5                             MongoDB로배우는NoSQL
NoSQL

            •    Not Only SQL
            •    데이터 스토어
            •    비 관계형을 지향
            •    대용량 처리를 목표



                                Q 구글은 어느 회사 DB를 쓸까?
                                   직접 만들어서 쓰나?


6                                 MongoDB로배우는NoSQL
CAP 이론 cap theorem




7            MongoDB로배우는NoSQL
Tales about…

    TELEPHONE SECRETARY


8                          MongoDB로배우는NoSQL
Data Models

•  Relational
•  Key-value
•  Column-oriented
   – Table no joins
•  Document-oriented
   – JSON or XML like, no joins




9                         MongoDB로배우는NoSQL
Consistent, Available (CA) Systems

•            전통적인 RDBMS
•            Vertica (column-oriented)
•            Aster Data (relational)
•            Greenplum (relational)




10                               MongoDB로배우는NoSQL
Consistent, Partition-Tolerant (CP) Systems

•            BigTable (column-oriented/tabular)
•            Hypertable (column-oriented/tabular)
•            HBase (column-oriented/tabular)
•            MongoDB (document-oriented)
•            Redis (key-value)
•            MemcacheDB (key-value)
•            Berkeley DB (key-value)


11                                    MongoDB로배우는NoSQL
Available, Partition-Tolerant (AP) Systems

•            Dynamo (key-value) amazon
•            Tokyo Cabinet (key-value)
•            KAI (key-value)
•            Cassandra (column-oriented) facebook p2p
•            CouchDB (document-oriented)
•            SimpleDB (document-oriented)




12                                      MongoDB로배우는NoSQL
라이선스 및 구현 비교 정리




                  *출처 : 10gen slide “No SQL, No problem”


13                    MongoDB로배우는NoSQL
소개


14   MongoDB로배우는NoSQL
몽고DB란?

•  MongoDB (from humongous)는 확장가능
   하고, 고성능을 지향하는 도큐먼트 기반의
   오픈소스 데이터 베이스.
•  C++로 작성되었음




                          by

15                     MongoDB로배우는NoSQL
특징

             •  Document-oriented storage
               –  JSON 스타일의 documents
               –  간결하고 강력한 동적 스키마 구성
             •  Full Index Support
               –  어느 속성에나 인덱스 설정 가능
             •  Replication  High Availability
               –  LAN과 WAN을 이용한 미러링



16                                    MongoDB로배우는NoSQL
특징 (계속)

             •  Auto-Sharding
               –  기능 손실 없는 수평 확장
             •  Querying
               –  풍부한 문서기반의 쿼리 지원
             •  Fast In-Place Updates
               –  성능문제를 일으키지 않는 정교한 수정
             •  Map/Reduce
               –  유연한 데이터 수집과 처리

17                              MongoDB로배우는NoSQL
특징 (계속)

             •  GridFS
               –  다양한 크기의 파일을 쉽게 저장
             •  Commercial Support
               –  기술 지원 기업이 존재, 교육, 컨설팅 지원 (
                  but 북미 이야기;;;)
             •  고성능
             •  간편한 관리


18                            MongoDB로배우는NoSQL
실
                습

             시작하기




19          MongoDB로배우는NoSQL
MongoDB 개요

             •    데이터의 기본 단위는 Document
             •    컬렉션은 Document의 집합
             •    자바스크립트 쉘 내장
             •    스키마가 없다.




20                           MongoDB로배우는NoSQL
Schema
             •  데이터베이스 스키마는
                데이터베이스에서 자료의 구조, 자료의 표현 방법, 자
                료 간의 관계를 정의한 것을 말하는 전산학 용어이다.
             •  데이터베이스 관리 시스템(DBMS)이 주어진 설정에
                따라 데이터베이스 스키마를 만들어 내며, 데이터베
                이스 사용자가 자료를 저장, 조회, 삭제, 변경할 때 DB
                MS는 그것이 생성한 데이터베이스 스키마를 참조하
                여 명령을 수행한다.




21                               MongoDB로배우는NoSQL
도큐먼트Document

             •  key:value 쌍으로 이루어진 JSON-like
              {
                      id:  1,
                      name:  Foo,
                      price:  123,  
                      tags:  [Bar,Eek]
              }




22                                      MongoDB로배우는NoSQL
도큐먼트Document

             { “hello” : “world” } ß 문서

             {
                 “이름” : “채수원”,    ß 또 다른 문서
                 “직업” : “무직”,
                 “나이” : 5
             }

23                                 MongoDB로배우는NoSQL
컬렉션 Collection

             •  document의 모음
             •  schema-free
             •  system으로 시작하는
                이름은 사용불가(예약어)
             •  db.컬렉션이름.명령어
              –  db.blog.insert(…)




24                           MongoDB로배우는NoSQL
실습




25         MongoDB로배우는NoSQL
서버 실행

             •  mongod --dbpath ./data/db
             •  mongo




26                                  MongoDB로배우는NoSQL
Database

             하나의 데이터 베이스는 자체 권한을 가지
             고 있으며 각각 파일로 존재한다.
             •  admin
                –  root DB
             •  local
                –  복제 제외 DB
             •  config
                –  샤드(shard)정보 저장

27                          MongoDB로배우는NoSQL
MongoDB shell

             •  Interactive console
             •  JavaScript 기반




28                            MongoDB로배우는NoSQL
기본CRUD(create, retrieve, update, delete)

             •  insert()
                  –  insert( {“name” : “world” } )
             •    find()
             •    findOne()
             •    update()
             •    remove()
                  –  remove( {“name” : “world” } )


29                                           MongoDB로배우는NoSQL
Shell Help

              help
              db.help()
              db.mycollection.help()
              db.mycollection.find().help()



                                        db.mycollection.help??



30                                           MongoDB로배우는NoSQL
Shell database관련

              db.version()

              var titles = [blog, cafe, message];
              db.blog.insert( titles );
              for ( i in titles) {
                  print( db.blog[ titles[i] ]);
               }


31                                        MongoDB로배우는NoSQL
Shell database관련

              db.version()
              use 데이터베이스_이름
              show collections




32                        MongoDB로배우는NoSQL
Data Types

             •    null
             •    boolean
             •    32비트 정수
             •    64비트 정수
             •    64비트 부동소수점형
             •    문자열
             •    심볼형

33                      MongoDB로배우는NoSQL
Data Types (이어서)

             •  객체ID
               –  ObjectId()
             •  날짜
               –  Date(), 1/1000초 단위
             •  정규표현식
               –  { a : /wo/i }




34                             MongoDB로배우는NoSQL
Data Types (이어서)

             •  코드형
                  –  { a” : function() { … } }
             •    이진데이터형
             •    최대값형
             •    최소값형
             •    undefined
             •    배열
             •    embedded document
35                                        MongoDB로배우는NoSQL
숫자

             •  Shell에서 모든 숫자는 더블double형으로
                취급 -- floating-point로 취급




36                           MongoDB로배우는NoSQL
Embedded Document

             {
                 name : John Doe,
                 address : {
                     street : 123 Street, city : ”Hamton,
                     state : NY
                 }
             }


                                                문제점은?



37                                                MongoDB로배우는NoSQL
_id




             •  ObjectId()
             •  o = new ObjectId()
             •  o.getTimestamp()



38                           MongoDB로배우는NoSQL
Array

             {things : [pie, 3.14]}




39                                MongoDB로배우는NoSQL
Collections 문서작성실습

             •    db.getCollectionNames()
             •    document 생성 : 영화제목, 장르
             •    db.getCollectionNames()
             •    db.system.indexes.find()




40                                   MongoDB로배우는NoSQL
insert

             •  db.foo.insert( document );
             •  batch insert -- fast!!
               –  but one collection only
             •  document size는 16M 까지
             •  BSON
               –  Object.bsonsize( db.blog )




41                                     MongoDB로배우는NoSQL
update

             •  var robin = db.blog.findOne( {name : 
                robin } );
             •  robin.age = 18;
             •  db.blog.update( {name : robin}, robin
                 );
             •  delete robin.age



42                                       MongoDB로배우는NoSQL
update이어서

             •  $inc
               –  db.blog.update( {name : robin }, {$inc
                  : {age : 1 } } )
               –  db.blog.update( {name : robin }, {$inc
                  : {exp : 1 } } )




43                                           MongoDB로배우는NoSQL
update이어서

             •  $set
               –  db.blog.update( {name : robin }, {$set
                  : {pow : 10 } } )
             •  $unset




44                                           MongoDB로배우는NoSQL
update이어서

             •  $rename
               –  db.blog.update( {name : robin }, {$rena
                  me : {pow : pwr } } )




45                                           MongoDB로배우는NoSQL
update이어서

             •  upsert
             db.blog.update( {name : robin }, robin, true
               );


             •  multi
                –  db.blog.update( { }, {$set : {level : 1 } }
                   , false, true );



46                                                MongoDB로배우는NoSQL
update이어서

             •  $push
                db.movie.insert({ title : dark knight })
                db.movie.update({ title : dark knight} , {$push :
               { character : batman } } );
             •  $addToSet
             •  db.getLastError()




47                                                  MongoDB로배우는NoSQL
save vs update

             db.mycollection.save(x);
             db.mycollection.update( { _id: x._id }, x, /
              *upsert*/ true );




48                                       MongoDB로배우는NoSQL
drop vs remove

              db.blog.remove( fake );
              db.blog.drop();




49                               MongoDB로배우는NoSQL
get-and-set

             {
                 _id : ObjectId(),
                 status : state,
                 priority : N
             }




50                             MongoDB로배우는NoSQL
get-and-set 이어서
ps = db.processes.find({status : READY).sort({priority : -1})
        .limit(1).next()
db.processes.update({_id : ps._id}, {$set : {status : RUNNING}})
do_something(ps);
db.processes.update({_id : ps._id}, {$set : {status : DONE}})




51                                                 MongoDB로배우는NoSQL
get-and-set 이어서
 ps = db.runCommand({findAndModify : processes,
         query : {status : READY},
         sort : {priority : -1},
         update : {$set : {status : RUNNING}})
{
   ok : 1,
   value : {
   _id : ObjectId(4b3e7a18005cab32be6291f7), priority : 1,
   status : READY
}}




52                                                MongoDB로배우는NoSQL
get-and-set 이어서

             •  형식
              –  findAndModify
              –  query
              –  sort
              –  update / remove
              –  new
             •  오직 존재하는 문서만 갱신가능


53                         MongoDB로배우는NoSQL
Fastest Write Mechanism

             •  fire-and-forget




54                        MongoDB로배우는NoSQL
Safe Operations

             •  getLastError()




55                       MongoDB로배우는NoSQL
질의 query




56              MongoDB로배우는NoSQL
Query

              db.users.find({age : 27})
              db.users.find({username : joe, age
             : 27})
              db.users.find({}, {username : 1, email
              : 1})




57                                      MongoDB로배우는NoSQL
제약사항

             •  db.stock.find({in_stock : stock.no})




58                                        MongoDB로배우는NoSQL
Query 조건문

              db.users.find({age : {$gte : 18, $lte
             : 30}})

              start = new Date(01/01/2007)
              db.users.find({”D-day : {$lt : start}})

              db.users.find({”name : {$ne : joe}})


59                                         MongoDB로배우는NoSQL
OR

              db.raffle.find({ticket_no : {$in : [725,
             542, 390]}})

              db.raffle.find({ticket_no : {$nin : [725
             , 542, 390]}})

              db.raffle.find({$or : [{ticket_no : 725},
             {winner : true}]})

60                                         MongoDB로배우는NoSQL
Not

              db.users.find({id_num : {$mod : [5, 1
             ]}})

              db.users.find({id_num : {$not : {$mo
             d : [5, 1]}}})




61                                      MongoDB로배우는NoSQL
조건 규칙

              db.users.find(
                  {age : {$lt : 30, $gt : 20}})




62                                          MongoDB로배우는NoSQL
null
 db.c.find()
{ _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null }
{ _id : ObjectId(4ba0f0dfd22aa494fd523622), y : 1 }
{ _id : ObjectId(4ba0f148d22aa494fd523623), y : 2 }

 db.c.find({y : null})
{ _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null }

 db.c.find({z : null})
{ _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null }
{ _id : ObjectId(4ba0f0dfd22aa494fd523622), y : 1 }
{ _id : ObjectId(4ba0f148d22aa494fd523623), y : 2 }



63                                                 MongoDB로배우는NoSQL
정규표현식Regular Expressions

              db.users.find({name : /joe/i})

              db.users.find({name : /joey?/i})




64                                          MongoDB로배우는NoSQL
배열검색
 db.food.insert({fruit : [apple, banana, peach]})
 db.food.find({fruit : banana})




65                                                   MongoDB로배우는NoSQL
배열검색$all
 db.food.insert({_id : 1, fruit : [apple, banana, peach]})
 db.food.insert({_id : 2, fruit : [apple, kumquat, orange]})
 db.food.insert({_id : 3, fruit : [cherry, banana, apple]})

 db.food.find({fruit : {$all : [apple, banana]}})
{_id : 1, fruit : [apple, banana, peach]}
{_id : 3, fruit : [cherry, banana, apple]}

 db.food.find({fruit : [apple, banana]})
 db.food.find({fruit.2 : peach})




66                                                      MongoDB로배우는NoSQL
배열검색$size
 db.food.find({fruit : {$size : 3}})

 db.food.update({$push : {fruit : strawberry}, $inc : {size : 1}})
 db.food.find({size : {$gt : 3}})




67                                                      MongoDB로배우는NoSQL
배열검색$slice
 db.blog.posts.findOne(criteria, {comments : {$slice : 10}})
 db.blog.posts.findOne(criteria, {comments : {$slice : -10}})
 db.blog.posts.findOne(criteria, {comments : {$slice : [23, 10]}})
                        {
                        _id : ObjectId(4b2d75476cc613d5ee930164),
                        title : A blog post,
                        content : ...,
                        comments : [
                        {
                                    name : joe,
                                    email : joe@example.com,
                                    content : nice post. },
                        {
                                    name : bob,
                                    email : bob@example.com,
                                    content : good post. }
                        ]}

68                                                      MongoDB로배우는NoSQL
Embedded Documents 검색

             {
                 name : {
                      first : Joe,
                      last : Schmoe
                 },
                 age : 45
             }


69                                MongoDB로배우는NoSQL
Embedded Documents 검색
 db.people.find({name : {first : Joe, last : Schmoe}})

 db.people.find({name.first : Joe, name.last : Schmoe})




70                                                    MongoDB로배우는NoSQL
Embedded Documents 검색
 db.blog.find()
{
content : ...,
comments : [
        {
                     author : joe, score : 3,
                     comment : nice post
              },
              {
                     author : mary,
                     score : 6,
                     comment : terrible post
              }]
}
71                                            MongoDB로배우는NoSQL
Embedded Documents 검색

             •  내장 문서는 전체 문서가 다 일치해야 한
                다! ç 문제발생!!




72                       MongoDB로배우는NoSQL
Embedded Documents 검색
•   db.blog.find({comments : {$elemMatch : {author : joe,
   score : {$gte : 5}}}})




73                                                 MongoDB로배우는NoSQL
Embedded Documents 검색

              db.blog.find(
                   {comments : {$elemMatch : {aut
             hor : joe”,score : {$gte : 5} }} } )




74                                      MongoDB로배우는NoSQL
$where
 db.foo.insert({apple : 1, banana : 6, peach : 3})
 db.foo.insert({apple : 8, spinach : 4, watermelon : 4})



 db.foo.find({$where : this.x + this.y == 10})
 db.foo.find({$where : function() { return this.x + this.y == 10; }})




75                                                     MongoDB로배우는NoSQL
커서cursor

              for(i=0; i100; i++) {
             ... db.c.insert({x : i});
             ... }
              var cursor = db.collection.find();

              while (cursor.hasNext()) {
             ... obj = cursor.next();
             ... // do stuff
             ... }
76                                          MongoDB로배우는NoSQL
커서cursor

              var cursor = db.people.find();
              cursor.forEach(function(x) {
             ... print(x.name);
             ... });




77                                      MongoDB로배우는NoSQL
Limits, Skips, Sorts

              db.c.find().limit(3)
              db.c.find().skip(3)
              db.c.find().sort({username : 1, age : -1})
              db.stock.find({desc : mp3}).limit(50).
             sort({price : -1})




78                                       MongoDB로배우는NoSQL
skip 피하기
 var page1 = db.foo.find(criteria).limit(100)
 var page2 = db.foo.find(criteria).skip(100).limit(100)  var page3 = db.fo
o.find(criteria).skip(200).limit(100)



var latest = null;
while (page1.hasNext()) { latest = page1.next();
         display(latest);
}
var page2 = db.foo.find({date : {$gt : latest.date}});
page2.sort({date : -1}).limit(100);




79                                                   MongoDB로배우는NoSQL
random
 var total = db.foo.count()
 var random = Math.floor(Math.random()*total)
 db.foo.find().skip(random).limit(1)

 db.people.insert({name : joe, random : Math.random()})
 db.people.insert({name : john, random : Math.random()})
 db.people.insert({name : jim, random : Math.random()})

 var random = Math.random()
 result = db.foo.findOne({random : {$gt : random}})




80                                                 MongoDB로배우는NoSQL
쿼리 결과의 일관성 유지

             cursor = db.foo.find();
             while (cursor.hasNext()) {
                  var doc = cursor.next();
                  doc = process(doc);
                  db.foo.save(doc);
             }



81                                   MongoDB로배우는NoSQL
$snapshot

             var cursor = db.foo.find().snapshot();

             var cursor = db.foo.find( { $query :{}, $sna
             pshot : true } );




82                                       MongoDB로배우는NoSQL
인덱스 index




83               MongoDB로배우는NoSQL
인덱스

             case1
              {user : 1, date : -1}
                vs
              {date : -1, user : 1}

             case2
              index for sort

84                            MongoDB로배우는NoSQL
인덱스 설정

              db.people.find({username : mark})

              db.people.ensureIndex({username : 1})




85                                     MongoDB로배우는NoSQL
인덱스 전략

             case1
              {user : 1, date : -1}
                vs
              {date : -1, user : 1}

             case2
              index for sort

86                            MongoDB로배우는NoSQL
index name

             •  keyname1_dir1_keyname2_dir2…
             •  인덱스 이름 변경

               db.foo.ensureIndex(
                 {“a”:1…}, {“name”:”myindex”} )




87                                   MongoDB로배우는NoSQL
unique index

             db.people.ensureIndex(
               {“username”:1}, {“unique”:true} )

             •  use getLastError

                 예) db.getLastError()
             •  _id :default unique index
             •  compound unique index도 가능함
88                                         MongoDB로배우는NoSQL
중복 제거

             db.people.ensureIndex(
               {“username”:1},
               {“unique”:true, “dropDups”: true} )




89                                      MongoDB로배우는NoSQL
missing key

             •  db.things.ensureIndex(
                {firstname: 1}, {unique: true});

               db.things.save({lastname: Smith});

             •  db.things.save({lastname: Jones});
                à error!!


90                                         MongoDB로배우는NoSQL
Index 관리

             •  system.indexes 컬렉션




91                           MongoDB로배우는NoSQL
Index 삭제

             •  db.runcommand({“dropIndexes”:”people
                ”, “index”:”myIndex”} )

             •  db.runcommand(
                {“dropIndexes”:”people”,“index”:”*”} )

             •  db.collection.dropIndexes();


92                                       MongoDB로배우는NoSQL
Index Rebuild

             •  db.myCollection.reIndex()

             •  db.runCommand( { reIndex : 'myCollecti
                on' } )




93                                    MongoDB로배우는NoSQL
explain, hint

             •  db.collectionName.find(…).explain()
             •  db.collectionName.find(…).hint()




94                                     MongoDB로배우는NoSQL
sparse index
              db.people.ensureIndex({title : 1}, {sparse : true})
              db.people.save({name:Jim})
              db.people.save({name:Sarah, title:Princess})
              db.people.find()
                { _id : ObjectId(4de6abd5da558a49fc5eef29), name : Jim }
                { _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title : 
                Princess }
              db.people.find().sort({title:1}) // only 1 doc returned because sparse
                { _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title : 
                Princess }




                                                                                 뒤로 이어서…
95                                                                      MongoDB로배우는NoSQL
sparse index (계속)
              db.people.dropIndex({title : 1})
                { nIndexesWas : 2, ok : 1 }
              db.people.find().sort({title:1}) // no more index, returns all documents
                { _id : ObjectId(4de6abd5da558a49fc5eef29), name : Jim }
                { _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title : 
                Princess }




96                                                                       MongoDB로배우는NoSQL
2D Geospatial indexes

             •  db.places.ensureIndex( { loc : 2d } )
             •  2d documents
               { loc : [ 50 , 30 ] }
               { loc : { x : 50 , y : 30 } }
               { loc : { foo : 50 , y : 30 } }
               { loc : { long : 40.739037, lat: 73.992964 } }
             •  only 1 geospatial index per collection


97                                            MongoDB로배우는NoSQL
2D Geospatial indexes (계속)

             •  Query
               db.places.find( { loc : [50,50] } )
               db.places.find( { loc : { $near : [50,50] } } )
               db.places.find( { loc : { $near : [50,50] } } ).li
                mit(20)
               db.places.find( { loc : { $near : [50,50] ,        $
                maxDistance : 5 } } ).limit(20)



98                                               MongoDB로배우는NoSQL
2D Geospatial indexes (계속)

•  within
 polygonA = [ [ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ] ]
 polygonB = { a : { x : 10, y : 20 }, b : { x : 15, y : 25 }, c : { x :
   20, y : 20 } }
 db.places.find(
  { loc : { $within : { $polygon : polygonA } } })
 db.places.find(
  { loc : { $within : { $polygon : polygonB } } })




99                                               MongoDB로배우는NoSQL
주의사항

              •  일반적으로 ‘인덱스’가 갖는 특징을 동일
                 하게 갖는다.
                 •  쿼리 결과 반환비율
                 •  CUD 부하
                 •  Cardinality
                 •  공간차지
                 •  인덱스 생성시의 부하




100                       MongoDB로배우는NoSQL
집계 Aggregation




101                    MongoDB로배우는NoSQL
count

              •  db.movie.count()
              •  db.movie.count( {“title” : “shark”} )

              •  db.pageviews.count({date: {'$gte': new
                 Date(Nov 1, 2009), '$lt': new Date(De
                 c 1, 2009)}})



102                                         MongoDB로배우는NoSQL
distinct

              {name : Ada, age : 20}
              {name : Fred, age : 35}
              {name : Susan, age : 60}
              {name : Andy, age : 35}

               db.runCommand({distinct : people, 
              key : age})


103                                     MongoDB로배우는NoSQL
group

              select a,b,sum(c) csum from coll where a
              ctive=1 group by a,b




104                                    MongoDB로배우는NoSQL
group

              db.coll.group({
                   key: { a:true, b:true },
                   cond: { active:1 },
                   reduce: function(obj, prev) {
                          prev.csum += obj.c; },
                   initial: { csum: 0 }
              });

105                                        MongoDB로배우는NoSQL
group

              {day : 2010/10/03, price : 4.23}
              {day : 2010/10/04, price : 4.27}
              {day : 2010/10/03, price : 4.10}
              {day : 2010/10/06, price : 4.30}
              {day : 2010/10/04”, price : 4.01}




106                                       MongoDB로배우는NoSQL
group

              db.stocks.group({
                   key : {day : true },
                   initial : {sum : 0},
                   $reduce : function(doc, prev) {
                                 prev.sum += doc.price;
                   }
              })


107                                       MongoDB로배우는NoSQL
group

              ns
              key
              initial”
              $reduce
              condition




108                 MongoDB로배우는NoSQL
group




109           MongoDB로배우는NoSQL
group




110           MongoDB로배우는NoSQL
group




111           MongoDB로배우는NoSQL
group




112           MongoDB로배우는NoSQL
Group $keyf

               db.posts.group(
                   {ns : posts,
                   $keyf : function(x) {
                      return x.category.toLowerCase();
                   },
                   initializer : ... })



113                                    MongoDB로배우는NoSQL
MapReduce

              - Google
              -  페타바이트 이상의 대용량 데이터를 신
                 뢰할 수 없는 컴퓨터로 구성된 클러스터
                 환경에서 병렬 처리를 지원하기 위해서
                 개발
              -  map, reduce 함수로 구성



114                      MongoDB로배우는NoSQL
MapReduce map

              map = function () {
                for (var key in this) {
                   emit(key, {count:1});
                }
              }




115                                MongoDB로배우는NoSQL
MapReduce reduce

              reduce = function (key, emits) {
                total = 0;
                for (var i in emits) {
                   total += emits[i].count;
                }
                return {count:total};
              }

116                                      MongoDB로배우는NoSQL
MapReduce
db.runCommand({mapreduce : ”blog, map : map, reduce : reduce})

db.blog.mapReduce(map, reduce, {out: { inline : 1}})




117                                            MongoDB로배우는NoSQL
기타등등 miscellaneous




118          MongoDB로배우는NoSQL
RDBMS유저를 위한 Query 비
              교
              •  http://www.mongodb.org/display/DOCS/
                 SQL+to+Mongo+Mapping+Chart




119                                   MongoDB로배우는NoSQL
Capped Collections

              •  very high performance
                   –  빠른 입력
                   –  바른 출력
              •    auto-FIFO age-out 기능
              •    Logging
              •    입력순서 자동유지
              •    Caching
              •    Automatic Age Out
120                               MongoDB로배우는NoSQL
Capped Collections이어서

              •    circular queues
              •    update, remove불가
              •    No index
              •    tailable지원




121                           MongoDB로배우는NoSQL
Capped Collections
•  db.createCollection(”blog, {capped:true, size:100000})

•  db.createCollection(”blog, {capped:true, size:100000, max: 100})

•  db. blog.find().sort({$natural : -1})




122                                              MongoDB로배우는NoSQL
GridFS
•  리플리케이션 설정시, 자동으로 파일 백업
•  한 디렉터리내에 수백만개의 파일 저장가능
•  파일과 함께 관련된 데이터 저장가능 (수정한 사람, 다운로드 수, 설명등
   등)
•  document당 1개만 첨부가능




123                      MongoDB로배우는NoSQL
GridFS fs.files

              {
                _id : unspecified,
                length : data_number,
                chunkSize : data_number,
               uploadDate : data_date,
                md5 : data_string
              }

124                                  MongoDB로배우는NoSQL
DBref

              •  {$ref : collection, $id : id_value}
              •  {$ref : collection, $id : id_value, $db
                  : database}




125                                         MongoDB로배우는NoSQL
DB관리

              •  startup/shutdown
              •  monitoring
                –  web
                –  mongostat




126                         MongoDB로배우는NoSQL
인증 Authentication

               db.addUser(root, 1234);
               db.addUser(read_only, 4321, true);
               db.auth(root, 1234);

               db.system.users.remove({user : test_
                user});



127                                     MongoDB로배우는NoSQL
NoSQL 비교자료

              http://kkovacs.eu/cassandra-vs-mongodb
              -vs-couchdb-vs-redis




128                                  MongoDB로배우는NoSQL
백업/복구




129           MongoDB로배우는NoSQL
mongodump/mongorestore

              •  $ ./mongodump -d test -o backup
              •  $ ./mongorestore -d foo --drop backup/t
                 est/




130                                     MongoDB로배우는NoSQL
fsync

               db.runCommand({fsync : 1, lock : 1})
                ;

               db.$cmd.sys.unlock.findOne();




131                                     MongoDB로배우는NoSQL
repairDatabase

               db.repairDatabase()

               mongod --dbpath=/data/db --repair




132                                   MongoDB로배우는NoSQL
분산복제   replication




133                        MongoDB로배우는NoSQL
master-slave
•             $ mkdir -p ~/dbs/master
•             $ ./mongod --dbpath ~/dbs/master --port 10000 --master
•             $ mkdir -p ~/dbs/slave
•             $ ./mongod --dbpath ~/dbs/slave --port 10001 --slave --source localhos
              t:10000




134                                                         MongoDB로배우는NoSQL
master-slave

              •    --only
              •    --slavedelay
              •    --fastsync
              •    --autoresync
              •    --oplogSize
                   master의 oplog size 지정(MB)




135                                    MongoDB로배우는NoSQL
master-slave 추가/제거
•  $ ./mongod --slave --dbpath ~/dbs/slave --port 27018

 use local
 db.sources.insert({host : localhost:27017})
 db.sources.find()
 db.sources.insert({host : prod.example.com:27017})
 db.sources.remove({host : localhost:27017})




136                                                MongoDB로배우는NoSQL
레플리카 셋replica sets




137                        MongoDB로배우는NoSQL
레플리카 셋replica sets
•  $ cat /etc/hostname
•  $ mkdir -p ~/dbs/node1 ~/dbs/node2

•  $ ./mongod --dbpath ~/dbs/node1 --port 10001 --replSet blog/earth:100
   02
•  $ ./mongod --dbpath ~/dbs/node2 --port 10002 --replSet blog/earth:100
   01

•  $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100
   01
•  $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100
   01,morton:10002



138                                             MongoDB로배우는NoSQL
레플리카 셋replica sets
•  $ ./mongo morton:10001/admin

              db.runCommand({replSetInitiate : {
                   _id : blog,
                   members : [
                             {
                             _id : 1,
                             host : earth:10001
                             },
                  {
                            _id : 2,
                            host : earth:10002
                   } ]}})
139                                           MongoDB로배우는NoSQL
레플리카 셋replica sets

              •  standard
                 –  일반노드.투표에 참여. 주 노드가 될 수 있
                    음
              •  passive
                 –  전체 데이터를 가지고 있음
              •  arbiter
                 –  투표에만 참여. 복제본(X)



140                            MongoDB로배우는NoSQL
레플리카 셋replica sets

               members.push({
              ... _id : 3,
              ... host : earth:10003,
              ... priority : 40
              ... });




141                                 MongoDB로배우는NoSQL
레플리카 셋replica sets




142                        MongoDB로배우는NoSQL
레플리카 셋replica sets




143                        MongoDB로배우는NoSQL
레플리카 셋replica sets




144                        MongoDB로배우는NoSQL
oplog
•  operation log
•  oplog.$main

 db.slaves.find()
db.sources.find()
 db.runCommand({getLastError: 1, w: N});

 db.printReplicationInfo();




145                                 MongoDB로배우는NoSQL
샤딩   sharding




146                   MongoDB로배우는NoSQL
Sharding

              •  현재 장비에 디스크 공간이 부족할 때
              •  단인 mongod가 처리할 때 보다 빠르게
                 데이터를 쓰고 싶을 때
              •  성능 향상을 위해 더 많은 데이터를 메모
                 리에 올려 두고 싶을 때




147                        MongoDB로배우는NoSQL
Sharding




148              MongoDB로배우는NoSQL
Shard key

              •    name
              •    timestamp
              •    category
              •    local
              •    level type
              •    etc



149                     MongoDB로배우는NoSQL
Autosharding

              •  Shard
              •  mongos
              •  config server




150                      MongoDB로배우는NoSQL
Autosharding
•  설정서버 시작
•  $ mkdir -p ~/dbs/config
•  $ ./mongod --dbpath ~/dbs/config --port 20000

•  mongos 기동
•  $ ./mongos --port 30000 --configdb localhost:20000




151                                             MongoDB로배우는NoSQL
Autosharding
•  샤드추가
•  $ mkdir -p ~/dbs/shard1
•  $ ./mongod --dbpath ~/dbs/shard1 --port 10000

•  $ ./mongo localhost:30000/admin
 db.runCommand({addshard : localhost:10000, allowLocal : true})

•  컬렉션을 샤딩으로 지정
 db.runCommand({enablesharding : foo})
 db.runCommand({shardcollection : foo.bar, key : {_id : 1}})




152                                                 MongoDB로배우는NoSQL
Autosharding
•             $ mkdir -p ~/dbs/config1 ~/dbs/config2 ~/dbs/config3
•             $ ./mongod --dbpath ~/dbs/config1 --port 20001
•             $ ./mongod --dbpath ~/dbs/config2 --port 20002
•             $ ./mongod --dbpath ~/dbs/config3 --port 20003

•  $ ./mongos --configdb localhost:20001,localhost:20002,localhost:2000
   3




153                                                          MongoDB로배우는NoSQL
Autosharding
 db.shards.find()
 db.databases.find()
 db.chunks.find()
 db.printShardingStatus()
 db.runCommand({removeshard : localhost:10000});
 db.runCommand({removeshard : localhost:10000});




154                                             MongoDB로배우는NoSQL

More Related Content

What's hot

이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.Kris Jeong
 
NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스Choonghyun Yang
 
No sql 이해 및 활용 공개용
No sql 이해 및 활용 공개용No sql 이해 및 활용 공개용
No sql 이해 및 활용 공개용YOUNGGYU CHUN
 
[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습smartstudy_official
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개흥배 최
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리흥배 최
 
The nosql echossytem
The nosql echossytemThe nosql echossytem
The nosql echossytem종석 박
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]MongoDB
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30Donghan Kim
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기Jongwon Kim
 
Cubrid Inside 5th Session 3 Migration
Cubrid Inside 5th Session 3 MigrationCubrid Inside 5th Session 3 Migration
Cubrid Inside 5th Session 3 MigrationCUBRID
 
NoSQL Guide & Sample
NoSQL Guide &  SampleNoSQL Guide &  Sample
NoSQL Guide & SampleSangon Lee
 
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)InBum Kim
 
Not only sql 정리
Not only sql 정리Not only sql 정리
Not only sql 정리상봉 이
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Jin wook
 
NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가Choonghyun Yang
 
Memcached의 확장성 개선
Memcached의 확장성 개선Memcached의 확장성 개선
Memcached의 확장성 개선NAVER D2
 
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxMySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxNeoClova
 
Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Minchul Jung
 
하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기beom kyun choi
 

What's hot (20)

이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.
 
NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스
 
No sql 이해 및 활용 공개용
No sql 이해 및 활용 공개용No sql 이해 및 활용 공개용
No sql 이해 및 활용 공개용
 
[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
 
The nosql echossytem
The nosql echossytemThe nosql echossytem
The nosql echossytem
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기
 
Cubrid Inside 5th Session 3 Migration
Cubrid Inside 5th Session 3 MigrationCubrid Inside 5th Session 3 Migration
Cubrid Inside 5th Session 3 Migration
 
NoSQL Guide & Sample
NoSQL Guide &  SampleNoSQL Guide &  Sample
NoSQL Guide & Sample
 
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
 
Not only sql 정리
Not only sql 정리Not only sql 정리
Not only sql 정리
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략
 
NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가
 
Memcached의 확장성 개선
Memcached의 확장성 개선Memcached의 확장성 개선
Memcached의 확장성 개선
 
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxMySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptx
 
Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작
 
하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기
 

Viewers also liked

Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)InBum Kim
 
빅데이터 기본개념
빅데이터 기본개념빅데이터 기본개념
빅데이터 기본개념현주 유
 
MongoDB Basic Concepts
MongoDB Basic ConceptsMongoDB Basic Concepts
MongoDB Basic ConceptsMongoDB
 
Firebase for web (웹개발을 위한 파이어베이스) 3 Real-Time Database
Firebase for web (웹개발을 위한 파이어베이스) 3 Real-Time DatabaseFirebase for web (웹개발을 위한 파이어베이스) 3 Real-Time Database
Firebase for web (웹개발을 위한 파이어베이스) 3 Real-Time Database승빈이네 공작소
 
Mongo Web Apps: OSCON 2011
Mongo Web Apps: OSCON 2011Mongo Web Apps: OSCON 2011
Mongo Web Apps: OSCON 2011rogerbodamer
 
Oracle Database 12c Release 2 - New Features On Oracle Database Exadata Expr...
Oracle Database 12c Release 2 - New Features On Oracle Database Exadata  Expr...Oracle Database 12c Release 2 - New Features On Oracle Database Exadata  Expr...
Oracle Database 12c Release 2 - New Features On Oracle Database Exadata Expr...Alex Zaballa
 
Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7주영 송
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기JangHyuk You
 
애자일 스크럼과 JIRA
애자일 스크럼과 JIRA 애자일 스크럼과 JIRA
애자일 스크럼과 JIRA Terry Cho
 
5 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/25 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/2Fabio Fumarola
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리Junyi Song
 
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance TuningJi-Woong Choi
 

Viewers also liked (12)

Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
 
빅데이터 기본개념
빅데이터 기본개념빅데이터 기본개념
빅데이터 기본개념
 
MongoDB Basic Concepts
MongoDB Basic ConceptsMongoDB Basic Concepts
MongoDB Basic Concepts
 
Firebase for web (웹개발을 위한 파이어베이스) 3 Real-Time Database
Firebase for web (웹개발을 위한 파이어베이스) 3 Real-Time DatabaseFirebase for web (웹개발을 위한 파이어베이스) 3 Real-Time Database
Firebase for web (웹개발을 위한 파이어베이스) 3 Real-Time Database
 
Mongo Web Apps: OSCON 2011
Mongo Web Apps: OSCON 2011Mongo Web Apps: OSCON 2011
Mongo Web Apps: OSCON 2011
 
Oracle Database 12c Release 2 - New Features On Oracle Database Exadata Expr...
Oracle Database 12c Release 2 - New Features On Oracle Database Exadata  Expr...Oracle Database 12c Release 2 - New Features On Oracle Database Exadata  Expr...
Oracle Database 12c Release 2 - New Features On Oracle Database Exadata Expr...
 
Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기
 
애자일 스크럼과 JIRA
애자일 스크럼과 JIRA 애자일 스크럼과 JIRA
애자일 스크럼과 JIRA
 
5 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/25 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/2
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning
 

Similar to Mongo db로 배우는 nosql

토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1
토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1
토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1승빈이네 공작소
 
Mongodb and spatial
Mongodb and spatialMongodb and spatial
Mongodb and spatialJiyoon Kim
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
5. 솔루션 카달로그
5. 솔루션 카달로그5. 솔루션 카달로그
5. 솔루션 카달로그Terry Cho
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기sung ki choi
 
Introduction to mongo db
Introduction to mongo dbIntroduction to mongo db
Introduction to mongo dbMinho Kim
 
빅데이터, big data
빅데이터, big data빅데이터, big data
빅데이터, big dataH K Yoon
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략KTH
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기) YoungSu Son
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬KTH, 케이티하이텔
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석smartstudy_official
 
Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summaryHoChul Shin
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례Jeongsang Baek
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30Donghan Kim
 
The Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDBThe Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDBSanghoon Lee
 
[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)
[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)
[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)NAVER D2
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XpressEngine
 
Backend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build toolsBackend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build toolsKyunghun Jeon
 

Similar to Mongo db로 배우는 nosql (20)

토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1
토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1
토이 프로젝트를 위한 속성 RDB(MySQL) 스터디 1
 
Amazon DynamoDB
Amazon DynamoDBAmazon DynamoDB
Amazon DynamoDB
 
Mongodb and spatial
Mongodb and spatialMongodb and spatial
Mongodb and spatial
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
5. 솔루션 카달로그
5. 솔루션 카달로그5. 솔루션 카달로그
5. 솔루션 카달로그
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
 
Introduction to mongo db
Introduction to mongo dbIntroduction to mongo db
Introduction to mongo db
 
빅데이터, big data
빅데이터, big data빅데이터, big data
빅데이터, big data
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략_데이터지능팀_성동찬
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
 
Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summary
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
 
The Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDBThe Architecture of Open Source Applications : GDB
The Architecture of Open Source Applications : GDB
 
Mongo jdbc
Mongo jdbcMongo jdbc
Mongo jdbc
 
[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)
[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)
[D2 CAMPUS] tech meet up(Back-end) - 교내 웹서비스 개발 일지 (박은찬님)
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
 
Backend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build toolsBackend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build tools
 

More from Suwon Chae

실패한 프로젝트들의 개발문화_개발방법론
실패한 프로젝트들의 개발문화_개발방법론실패한 프로젝트들의 개발문화_개발방법론
실패한 프로젝트들의 개발문화_개발방법론Suwon Chae
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDSuwon Chae
 
TDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDDTDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDDSuwon Chae
 
TDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: RefactoringTDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: RefactoringSuwon Chae
 
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsRyan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsSuwon Chae
 
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)Suwon Chae
 
잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)
잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)
잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)Suwon Chae
 

More from Suwon Chae (8)

실패한 프로젝트들의 개발문화_개발방법론
실패한 프로젝트들의 개발문화_개발방법론실패한 프로젝트들의 개발문화_개발방법론
실패한 프로젝트들의 개발문화_개발방법론
 
Refactoring
RefactoringRefactoring
Refactoring
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDD
 
TDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDDTDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDD
 
TDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: RefactoringTDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: Refactoring
 
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsRyan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
 
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
 
잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)
잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)
잘하면고효율, 못하면가문의원수가되는 짝프로그래밍 (Effective Pair Programming with Lessons Learned)
 

Mongo db로 배우는 nosql

  • 1. MongoDB로 배우는 NoSQL 채수원 blog.doortts.com doortts@gmail.com
  • 2. 진행목표 - 쉽게 - 학습 시간 단축 - 기초를 닦아서 발판을 마련 - Use ME!! 2 MongoDB로배우는NoSQL
  • 3. NoSQL 3 MongoDB로배우는NoSQL
  • 4. Think about DATABASE 4 MongoDB로배우는NoSQL
  • 5. in recently •  충분히 •  필요한 만큼 •  적절하게 •  잘 살아오고 있었다. 1983, DEC microcomputer (128kb ram) 5 MongoDB로배우는NoSQL
  • 6. NoSQL •  Not Only SQL •  데이터 스토어 •  비 관계형을 지향 •  대용량 처리를 목표 Q 구글은 어느 회사 DB를 쓸까? 직접 만들어서 쓰나? 6 MongoDB로배우는NoSQL
  • 7. CAP 이론 cap theorem 7 MongoDB로배우는NoSQL
  • 8. Tales about… TELEPHONE SECRETARY 8 MongoDB로배우는NoSQL
  • 9. Data Models •  Relational •  Key-value •  Column-oriented – Table no joins •  Document-oriented – JSON or XML like, no joins 9 MongoDB로배우는NoSQL
  • 10. Consistent, Available (CA) Systems •  전통적인 RDBMS •  Vertica (column-oriented) •  Aster Data (relational) •  Greenplum (relational) 10 MongoDB로배우는NoSQL
  • 11. Consistent, Partition-Tolerant (CP) Systems •  BigTable (column-oriented/tabular) •  Hypertable (column-oriented/tabular) •  HBase (column-oriented/tabular) •  MongoDB (document-oriented) •  Redis (key-value) •  MemcacheDB (key-value) •  Berkeley DB (key-value) 11 MongoDB로배우는NoSQL
  • 12. Available, Partition-Tolerant (AP) Systems •  Dynamo (key-value) amazon •  Tokyo Cabinet (key-value) •  KAI (key-value) •  Cassandra (column-oriented) facebook p2p •  CouchDB (document-oriented) •  SimpleDB (document-oriented) 12 MongoDB로배우는NoSQL
  • 13. 라이선스 및 구현 비교 정리 *출처 : 10gen slide “No SQL, No problem” 13 MongoDB로배우는NoSQL
  • 14. 소개 14 MongoDB로배우는NoSQL
  • 15. 몽고DB란? •  MongoDB (from humongous)는 확장가능 하고, 고성능을 지향하는 도큐먼트 기반의 오픈소스 데이터 베이스. •  C++로 작성되었음 by 15 MongoDB로배우는NoSQL
  • 16. 특징 •  Document-oriented storage –  JSON 스타일의 documents –  간결하고 강력한 동적 스키마 구성 •  Full Index Support –  어느 속성에나 인덱스 설정 가능 •  Replication High Availability –  LAN과 WAN을 이용한 미러링 16 MongoDB로배우는NoSQL
  • 17. 특징 (계속) •  Auto-Sharding –  기능 손실 없는 수평 확장 •  Querying –  풍부한 문서기반의 쿼리 지원 •  Fast In-Place Updates –  성능문제를 일으키지 않는 정교한 수정 •  Map/Reduce –  유연한 데이터 수집과 처리 17 MongoDB로배우는NoSQL
  • 18. 특징 (계속) •  GridFS –  다양한 크기의 파일을 쉽게 저장 •  Commercial Support –  기술 지원 기업이 존재, 교육, 컨설팅 지원 ( but 북미 이야기;;;) •  고성능 •  간편한 관리 18 MongoDB로배우는NoSQL
  • 19. 습 시작하기 19 MongoDB로배우는NoSQL
  • 20. MongoDB 개요 •  데이터의 기본 단위는 Document •  컬렉션은 Document의 집합 •  자바스크립트 쉘 내장 •  스키마가 없다. 20 MongoDB로배우는NoSQL
  • 21. Schema •  데이터베이스 스키마는 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자 료 간의 관계를 정의한 것을 말하는 전산학 용어이다. •  데이터베이스 관리 시스템(DBMS)이 주어진 설정에 따라 데이터베이스 스키마를 만들어 내며, 데이터베 이스 사용자가 자료를 저장, 조회, 삭제, 변경할 때 DB MS는 그것이 생성한 데이터베이스 스키마를 참조하 여 명령을 수행한다. 21 MongoDB로배우는NoSQL
  • 22. 도큐먼트Document •  key:value 쌍으로 이루어진 JSON-like {        id:  1,        name:  Foo,        price:  123,          tags:  [Bar,Eek] } 22 MongoDB로배우는NoSQL
  • 23. 도큐먼트Document { “hello” : “world” } ß 문서 { “이름” : “채수원”, ß 또 다른 문서 “직업” : “무직”, “나이” : 5 } 23 MongoDB로배우는NoSQL
  • 24. 컬렉션 Collection •  document의 모음 •  schema-free •  system으로 시작하는 이름은 사용불가(예약어) •  db.컬렉션이름.명령어 –  db.blog.insert(…) 24 MongoDB로배우는NoSQL
  • 25. 실습 25 MongoDB로배우는NoSQL
  • 26. 서버 실행 •  mongod --dbpath ./data/db •  mongo 26 MongoDB로배우는NoSQL
  • 27. Database 하나의 데이터 베이스는 자체 권한을 가지 고 있으며 각각 파일로 존재한다. •  admin –  root DB •  local –  복제 제외 DB •  config –  샤드(shard)정보 저장 27 MongoDB로배우는NoSQL
  • 28. MongoDB shell •  Interactive console •  JavaScript 기반 28 MongoDB로배우는NoSQL
  • 29. 기본CRUD(create, retrieve, update, delete) •  insert() –  insert( {“name” : “world” } ) •  find() •  findOne() •  update() •  remove() –  remove( {“name” : “world” } ) 29 MongoDB로배우는NoSQL
  • 30. Shell Help help db.help() db.mycollection.help() db.mycollection.find().help() db.mycollection.help?? 30 MongoDB로배우는NoSQL
  • 31. Shell database관련 db.version() var titles = [blog, cafe, message]; db.blog.insert( titles ); for ( i in titles) { print( db.blog[ titles[i] ]); } 31 MongoDB로배우는NoSQL
  • 32. Shell database관련 db.version() use 데이터베이스_이름 show collections 32 MongoDB로배우는NoSQL
  • 33. Data Types •  null •  boolean •  32비트 정수 •  64비트 정수 •  64비트 부동소수점형 •  문자열 •  심볼형 33 MongoDB로배우는NoSQL
  • 34. Data Types (이어서) •  객체ID –  ObjectId() •  날짜 –  Date(), 1/1000초 단위 •  정규표현식 –  { a : /wo/i } 34 MongoDB로배우는NoSQL
  • 35. Data Types (이어서) •  코드형 –  { a” : function() { … } } •  이진데이터형 •  최대값형 •  최소값형 •  undefined •  배열 •  embedded document 35 MongoDB로배우는NoSQL
  • 36. 숫자 •  Shell에서 모든 숫자는 더블double형으로 취급 -- floating-point로 취급 36 MongoDB로배우는NoSQL
  • 37. Embedded Document { name : John Doe, address : { street : 123 Street, city : ”Hamton, state : NY } } 문제점은? 37 MongoDB로배우는NoSQL
  • 38. _id •  ObjectId() •  o = new ObjectId() •  o.getTimestamp() 38 MongoDB로배우는NoSQL
  • 39. Array {things : [pie, 3.14]} 39 MongoDB로배우는NoSQL
  • 40. Collections 문서작성실습 •  db.getCollectionNames() •  document 생성 : 영화제목, 장르 •  db.getCollectionNames() •  db.system.indexes.find() 40 MongoDB로배우는NoSQL
  • 41. insert •  db.foo.insert( document ); •  batch insert -- fast!! –  but one collection only •  document size는 16M 까지 •  BSON –  Object.bsonsize( db.blog ) 41 MongoDB로배우는NoSQL
  • 42. update •  var robin = db.blog.findOne( {name : robin } ); •  robin.age = 18; •  db.blog.update( {name : robin}, robin ); •  delete robin.age 42 MongoDB로배우는NoSQL
  • 43. update이어서 •  $inc –  db.blog.update( {name : robin }, {$inc : {age : 1 } } ) –  db.blog.update( {name : robin }, {$inc : {exp : 1 } } ) 43 MongoDB로배우는NoSQL
  • 44. update이어서 •  $set –  db.blog.update( {name : robin }, {$set : {pow : 10 } } ) •  $unset 44 MongoDB로배우는NoSQL
  • 45. update이어서 •  $rename –  db.blog.update( {name : robin }, {$rena me : {pow : pwr } } ) 45 MongoDB로배우는NoSQL
  • 46. update이어서 •  upsert db.blog.update( {name : robin }, robin, true ); •  multi –  db.blog.update( { }, {$set : {level : 1 } } , false, true ); 46 MongoDB로배우는NoSQL
  • 47. update이어서 •  $push db.movie.insert({ title : dark knight }) db.movie.update({ title : dark knight} , {$push : { character : batman } } ); •  $addToSet •  db.getLastError() 47 MongoDB로배우는NoSQL
  • 48. save vs update db.mycollection.save(x); db.mycollection.update( { _id: x._id }, x, / *upsert*/ true ); 48 MongoDB로배우는NoSQL
  • 49. drop vs remove db.blog.remove( fake ); db.blog.drop(); 49 MongoDB로배우는NoSQL
  • 50. get-and-set { _id : ObjectId(), status : state, priority : N } 50 MongoDB로배우는NoSQL
  • 51. get-and-set 이어서 ps = db.processes.find({status : READY).sort({priority : -1}) .limit(1).next() db.processes.update({_id : ps._id}, {$set : {status : RUNNING}}) do_something(ps); db.processes.update({_id : ps._id}, {$set : {status : DONE}}) 51 MongoDB로배우는NoSQL
  • 52. get-and-set 이어서 ps = db.runCommand({findAndModify : processes, query : {status : READY}, sort : {priority : -1}, update : {$set : {status : RUNNING}}) { ok : 1, value : { _id : ObjectId(4b3e7a18005cab32be6291f7), priority : 1, status : READY }} 52 MongoDB로배우는NoSQL
  • 53. get-and-set 이어서 •  형식 –  findAndModify –  query –  sort –  update / remove –  new •  오직 존재하는 문서만 갱신가능 53 MongoDB로배우는NoSQL
  • 54. Fastest Write Mechanism •  fire-and-forget 54 MongoDB로배우는NoSQL
  • 55. Safe Operations •  getLastError() 55 MongoDB로배우는NoSQL
  • 56. 질의 query 56 MongoDB로배우는NoSQL
  • 57. Query db.users.find({age : 27}) db.users.find({username : joe, age : 27}) db.users.find({}, {username : 1, email : 1}) 57 MongoDB로배우는NoSQL
  • 58. 제약사항 •  db.stock.find({in_stock : stock.no}) 58 MongoDB로배우는NoSQL
  • 59. Query 조건문 db.users.find({age : {$gte : 18, $lte : 30}}) start = new Date(01/01/2007) db.users.find({”D-day : {$lt : start}}) db.users.find({”name : {$ne : joe}}) 59 MongoDB로배우는NoSQL
  • 60. OR db.raffle.find({ticket_no : {$in : [725, 542, 390]}}) db.raffle.find({ticket_no : {$nin : [725 , 542, 390]}}) db.raffle.find({$or : [{ticket_no : 725}, {winner : true}]}) 60 MongoDB로배우는NoSQL
  • 61. Not db.users.find({id_num : {$mod : [5, 1 ]}}) db.users.find({id_num : {$not : {$mo d : [5, 1]}}}) 61 MongoDB로배우는NoSQL
  • 62. 조건 규칙 db.users.find( {age : {$lt : 30, $gt : 20}}) 62 MongoDB로배우는NoSQL
  • 63. null db.c.find() { _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null } { _id : ObjectId(4ba0f0dfd22aa494fd523622), y : 1 } { _id : ObjectId(4ba0f148d22aa494fd523623), y : 2 } db.c.find({y : null}) { _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null } db.c.find({z : null}) { _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null } { _id : ObjectId(4ba0f0dfd22aa494fd523622), y : 1 } { _id : ObjectId(4ba0f148d22aa494fd523623), y : 2 } 63 MongoDB로배우는NoSQL
  • 64. 정규표현식Regular Expressions db.users.find({name : /joe/i}) db.users.find({name : /joey?/i}) 64 MongoDB로배우는NoSQL
  • 65. 배열검색 db.food.insert({fruit : [apple, banana, peach]}) db.food.find({fruit : banana}) 65 MongoDB로배우는NoSQL
  • 66. 배열검색$all db.food.insert({_id : 1, fruit : [apple, banana, peach]}) db.food.insert({_id : 2, fruit : [apple, kumquat, orange]}) db.food.insert({_id : 3, fruit : [cherry, banana, apple]}) db.food.find({fruit : {$all : [apple, banana]}}) {_id : 1, fruit : [apple, banana, peach]} {_id : 3, fruit : [cherry, banana, apple]} db.food.find({fruit : [apple, banana]}) db.food.find({fruit.2 : peach}) 66 MongoDB로배우는NoSQL
  • 67. 배열검색$size db.food.find({fruit : {$size : 3}}) db.food.update({$push : {fruit : strawberry}, $inc : {size : 1}}) db.food.find({size : {$gt : 3}}) 67 MongoDB로배우는NoSQL
  • 68. 배열검색$slice db.blog.posts.findOne(criteria, {comments : {$slice : 10}}) db.blog.posts.findOne(criteria, {comments : {$slice : -10}}) db.blog.posts.findOne(criteria, {comments : {$slice : [23, 10]}}) { _id : ObjectId(4b2d75476cc613d5ee930164), title : A blog post, content : ..., comments : [ { name : joe, email : joe@example.com, content : nice post. }, { name : bob, email : bob@example.com, content : good post. } ]} 68 MongoDB로배우는NoSQL
  • 69. Embedded Documents 검색 { name : { first : Joe, last : Schmoe }, age : 45 } 69 MongoDB로배우는NoSQL
  • 70. Embedded Documents 검색 db.people.find({name : {first : Joe, last : Schmoe}}) db.people.find({name.first : Joe, name.last : Schmoe}) 70 MongoDB로배우는NoSQL
  • 71. Embedded Documents 검색 db.blog.find() { content : ..., comments : [ { author : joe, score : 3, comment : nice post }, { author : mary, score : 6, comment : terrible post }] } 71 MongoDB로배우는NoSQL
  • 72. Embedded Documents 검색 •  내장 문서는 전체 문서가 다 일치해야 한 다! ç 문제발생!! 72 MongoDB로배우는NoSQL
  • 73. Embedded Documents 검색 •  db.blog.find({comments : {$elemMatch : {author : joe, score : {$gte : 5}}}}) 73 MongoDB로배우는NoSQL
  • 74. Embedded Documents 검색 db.blog.find( {comments : {$elemMatch : {aut hor : joe”,score : {$gte : 5} }} } ) 74 MongoDB로배우는NoSQL
  • 75. $where db.foo.insert({apple : 1, banana : 6, peach : 3}) db.foo.insert({apple : 8, spinach : 4, watermelon : 4}) db.foo.find({$where : this.x + this.y == 10}) db.foo.find({$where : function() { return this.x + this.y == 10; }}) 75 MongoDB로배우는NoSQL
  • 76. 커서cursor for(i=0; i100; i++) { ... db.c.insert({x : i}); ... } var cursor = db.collection.find(); while (cursor.hasNext()) { ... obj = cursor.next(); ... // do stuff ... } 76 MongoDB로배우는NoSQL
  • 77. 커서cursor var cursor = db.people.find(); cursor.forEach(function(x) { ... print(x.name); ... }); 77 MongoDB로배우는NoSQL
  • 78. Limits, Skips, Sorts db.c.find().limit(3) db.c.find().skip(3) db.c.find().sort({username : 1, age : -1}) db.stock.find({desc : mp3}).limit(50). sort({price : -1}) 78 MongoDB로배우는NoSQL
  • 79. skip 피하기 var page1 = db.foo.find(criteria).limit(100) var page2 = db.foo.find(criteria).skip(100).limit(100) var page3 = db.fo o.find(criteria).skip(200).limit(100) var latest = null; while (page1.hasNext()) { latest = page1.next(); display(latest); } var page2 = db.foo.find({date : {$gt : latest.date}}); page2.sort({date : -1}).limit(100); 79 MongoDB로배우는NoSQL
  • 80. random var total = db.foo.count() var random = Math.floor(Math.random()*total) db.foo.find().skip(random).limit(1) db.people.insert({name : joe, random : Math.random()}) db.people.insert({name : john, random : Math.random()}) db.people.insert({name : jim, random : Math.random()}) var random = Math.random() result = db.foo.findOne({random : {$gt : random}}) 80 MongoDB로배우는NoSQL
  • 81. 쿼리 결과의 일관성 유지 cursor = db.foo.find(); while (cursor.hasNext()) { var doc = cursor.next(); doc = process(doc); db.foo.save(doc); } 81 MongoDB로배우는NoSQL
  • 82. $snapshot var cursor = db.foo.find().snapshot(); var cursor = db.foo.find( { $query :{}, $sna pshot : true } ); 82 MongoDB로배우는NoSQL
  • 83. 인덱스 index 83 MongoDB로배우는NoSQL
  • 84. 인덱스 case1 {user : 1, date : -1} vs {date : -1, user : 1} case2 index for sort 84 MongoDB로배우는NoSQL
  • 85. 인덱스 설정 db.people.find({username : mark}) db.people.ensureIndex({username : 1}) 85 MongoDB로배우는NoSQL
  • 86. 인덱스 전략 case1 {user : 1, date : -1} vs {date : -1, user : 1} case2 index for sort 86 MongoDB로배우는NoSQL
  • 87. index name •  keyname1_dir1_keyname2_dir2… •  인덱스 이름 변경 db.foo.ensureIndex( {“a”:1…}, {“name”:”myindex”} ) 87 MongoDB로배우는NoSQL
  • 88. unique index db.people.ensureIndex( {“username”:1}, {“unique”:true} ) •  use getLastError 예) db.getLastError() •  _id :default unique index •  compound unique index도 가능함 88 MongoDB로배우는NoSQL
  • 89. 중복 제거 db.people.ensureIndex( {“username”:1}, {“unique”:true, “dropDups”: true} ) 89 MongoDB로배우는NoSQL
  • 90. missing key •  db.things.ensureIndex( {firstname: 1}, {unique: true}); db.things.save({lastname: Smith}); •  db.things.save({lastname: Jones}); à error!! 90 MongoDB로배우는NoSQL
  • 91. Index 관리 •  system.indexes 컬렉션 91 MongoDB로배우는NoSQL
  • 92. Index 삭제 •  db.runcommand({“dropIndexes”:”people ”, “index”:”myIndex”} ) •  db.runcommand( {“dropIndexes”:”people”,“index”:”*”} ) •  db.collection.dropIndexes(); 92 MongoDB로배우는NoSQL
  • 93. Index Rebuild •  db.myCollection.reIndex() •  db.runCommand( { reIndex : 'myCollecti on' } ) 93 MongoDB로배우는NoSQL
  • 94. explain, hint •  db.collectionName.find(…).explain() •  db.collectionName.find(…).hint() 94 MongoDB로배우는NoSQL
  • 95. sparse index db.people.ensureIndex({title : 1}, {sparse : true}) db.people.save({name:Jim}) db.people.save({name:Sarah, title:Princess}) db.people.find() { _id : ObjectId(4de6abd5da558a49fc5eef29), name : Jim } { _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title : Princess } db.people.find().sort({title:1}) // only 1 doc returned because sparse { _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title : Princess } 뒤로 이어서… 95 MongoDB로배우는NoSQL
  • 96. sparse index (계속) db.people.dropIndex({title : 1}) { nIndexesWas : 2, ok : 1 } db.people.find().sort({title:1}) // no more index, returns all documents { _id : ObjectId(4de6abd5da558a49fc5eef29), name : Jim } { _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title : Princess } 96 MongoDB로배우는NoSQL
  • 97. 2D Geospatial indexes •  db.places.ensureIndex( { loc : 2d } ) •  2d documents { loc : [ 50 , 30 ] } { loc : { x : 50 , y : 30 } } { loc : { foo : 50 , y : 30 } } { loc : { long : 40.739037, lat: 73.992964 } } •  only 1 geospatial index per collection 97 MongoDB로배우는NoSQL
  • 98. 2D Geospatial indexes (계속) •  Query db.places.find( { loc : [50,50] } ) db.places.find( { loc : { $near : [50,50] } } ) db.places.find( { loc : { $near : [50,50] } } ).li mit(20) db.places.find( { loc : { $near : [50,50] , $ maxDistance : 5 } } ).limit(20) 98 MongoDB로배우는NoSQL
  • 99. 2D Geospatial indexes (계속) •  within polygonA = [ [ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ] ] polygonB = { a : { x : 10, y : 20 }, b : { x : 15, y : 25 }, c : { x : 20, y : 20 } } db.places.find( { loc : { $within : { $polygon : polygonA } } }) db.places.find( { loc : { $within : { $polygon : polygonB } } }) 99 MongoDB로배우는NoSQL
  • 100. 주의사항 •  일반적으로 ‘인덱스’가 갖는 특징을 동일 하게 갖는다. •  쿼리 결과 반환비율 •  CUD 부하 •  Cardinality •  공간차지 •  인덱스 생성시의 부하 100 MongoDB로배우는NoSQL
  • 101. 집계 Aggregation 101 MongoDB로배우는NoSQL
  • 102. count •  db.movie.count() •  db.movie.count( {“title” : “shark”} ) •  db.pageviews.count({date: {'$gte': new Date(Nov 1, 2009), '$lt': new Date(De c 1, 2009)}}) 102 MongoDB로배우는NoSQL
  • 103. distinct {name : Ada, age : 20} {name : Fred, age : 35} {name : Susan, age : 60} {name : Andy, age : 35} db.runCommand({distinct : people, key : age}) 103 MongoDB로배우는NoSQL
  • 104. group select a,b,sum(c) csum from coll where a ctive=1 group by a,b 104 MongoDB로배우는NoSQL
  • 105. group db.coll.group({ key: { a:true, b:true }, cond: { active:1 }, reduce: function(obj, prev) { prev.csum += obj.c; }, initial: { csum: 0 } }); 105 MongoDB로배우는NoSQL
  • 106. group {day : 2010/10/03, price : 4.23} {day : 2010/10/04, price : 4.27} {day : 2010/10/03, price : 4.10} {day : 2010/10/06, price : 4.30} {day : 2010/10/04”, price : 4.01} 106 MongoDB로배우는NoSQL
  • 107. group db.stocks.group({ key : {day : true }, initial : {sum : 0}, $reduce : function(doc, prev) { prev.sum += doc.price; } }) 107 MongoDB로배우는NoSQL
  • 108. group ns key initial” $reduce condition 108 MongoDB로배우는NoSQL
  • 109. group 109 MongoDB로배우는NoSQL
  • 110. group 110 MongoDB로배우는NoSQL
  • 111. group 111 MongoDB로배우는NoSQL
  • 112. group 112 MongoDB로배우는NoSQL
  • 113. Group $keyf db.posts.group( {ns : posts, $keyf : function(x) { return x.category.toLowerCase(); }, initializer : ... }) 113 MongoDB로배우는NoSQL
  • 114. MapReduce - Google -  페타바이트 이상의 대용량 데이터를 신 뢰할 수 없는 컴퓨터로 구성된 클러스터 환경에서 병렬 처리를 지원하기 위해서 개발 -  map, reduce 함수로 구성 114 MongoDB로배우는NoSQL
  • 115. MapReduce map map = function () { for (var key in this) { emit(key, {count:1}); } } 115 MongoDB로배우는NoSQL
  • 116. MapReduce reduce reduce = function (key, emits) { total = 0; for (var i in emits) { total += emits[i].count; } return {count:total}; } 116 MongoDB로배우는NoSQL
  • 117. MapReduce db.runCommand({mapreduce : ”blog, map : map, reduce : reduce}) db.blog.mapReduce(map, reduce, {out: { inline : 1}}) 117 MongoDB로배우는NoSQL
  • 118. 기타등등 miscellaneous 118 MongoDB로배우는NoSQL
  • 119. RDBMS유저를 위한 Query 비 교 •  http://www.mongodb.org/display/DOCS/ SQL+to+Mongo+Mapping+Chart 119 MongoDB로배우는NoSQL
  • 120. Capped Collections •  very high performance –  빠른 입력 –  바른 출력 •  auto-FIFO age-out 기능 •  Logging •  입력순서 자동유지 •  Caching •  Automatic Age Out 120 MongoDB로배우는NoSQL
  • 121. Capped Collections이어서 •  circular queues •  update, remove불가 •  No index •  tailable지원 121 MongoDB로배우는NoSQL
  • 122. Capped Collections •  db.createCollection(”blog, {capped:true, size:100000}) •  db.createCollection(”blog, {capped:true, size:100000, max: 100}) •  db. blog.find().sort({$natural : -1}) 122 MongoDB로배우는NoSQL
  • 123. GridFS •  리플리케이션 설정시, 자동으로 파일 백업 •  한 디렉터리내에 수백만개의 파일 저장가능 •  파일과 함께 관련된 데이터 저장가능 (수정한 사람, 다운로드 수, 설명등 등) •  document당 1개만 첨부가능 123 MongoDB로배우는NoSQL
  • 124. GridFS fs.files { _id : unspecified, length : data_number, chunkSize : data_number, uploadDate : data_date, md5 : data_string } 124 MongoDB로배우는NoSQL
  • 125. DBref •  {$ref : collection, $id : id_value} •  {$ref : collection, $id : id_value, $db : database} 125 MongoDB로배우는NoSQL
  • 126. DB관리 •  startup/shutdown •  monitoring –  web –  mongostat 126 MongoDB로배우는NoSQL
  • 127. 인증 Authentication db.addUser(root, 1234); db.addUser(read_only, 4321, true); db.auth(root, 1234); db.system.users.remove({user : test_ user}); 127 MongoDB로배우는NoSQL
  • 128. NoSQL 비교자료 http://kkovacs.eu/cassandra-vs-mongodb -vs-couchdb-vs-redis 128 MongoDB로배우는NoSQL
  • 129. 백업/복구 129 MongoDB로배우는NoSQL
  • 130. mongodump/mongorestore •  $ ./mongodump -d test -o backup •  $ ./mongorestore -d foo --drop backup/t est/ 130 MongoDB로배우는NoSQL
  • 131. fsync db.runCommand({fsync : 1, lock : 1}) ; db.$cmd.sys.unlock.findOne(); 131 MongoDB로배우는NoSQL
  • 132. repairDatabase db.repairDatabase() mongod --dbpath=/data/db --repair 132 MongoDB로배우는NoSQL
  • 133. 분산복제 replication 133 MongoDB로배우는NoSQL
  • 134. master-slave •  $ mkdir -p ~/dbs/master •  $ ./mongod --dbpath ~/dbs/master --port 10000 --master •  $ mkdir -p ~/dbs/slave •  $ ./mongod --dbpath ~/dbs/slave --port 10001 --slave --source localhos t:10000 134 MongoDB로배우는NoSQL
  • 135. master-slave •  --only •  --slavedelay •  --fastsync •  --autoresync •  --oplogSize master의 oplog size 지정(MB) 135 MongoDB로배우는NoSQL
  • 136. master-slave 추가/제거 •  $ ./mongod --slave --dbpath ~/dbs/slave --port 27018 use local db.sources.insert({host : localhost:27017}) db.sources.find() db.sources.insert({host : prod.example.com:27017}) db.sources.remove({host : localhost:27017}) 136 MongoDB로배우는NoSQL
  • 137. 레플리카 셋replica sets 137 MongoDB로배우는NoSQL
  • 138. 레플리카 셋replica sets •  $ cat /etc/hostname •  $ mkdir -p ~/dbs/node1 ~/dbs/node2 •  $ ./mongod --dbpath ~/dbs/node1 --port 10001 --replSet blog/earth:100 02 •  $ ./mongod --dbpath ~/dbs/node2 --port 10002 --replSet blog/earth:100 01 •  $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100 01 •  $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100 01,morton:10002 138 MongoDB로배우는NoSQL
  • 139. 레플리카 셋replica sets •  $ ./mongo morton:10001/admin db.runCommand({replSetInitiate : { _id : blog, members : [ { _id : 1, host : earth:10001 }, { _id : 2, host : earth:10002 } ]}}) 139 MongoDB로배우는NoSQL
  • 140. 레플리카 셋replica sets •  standard –  일반노드.투표에 참여. 주 노드가 될 수 있 음 •  passive –  전체 데이터를 가지고 있음 •  arbiter –  투표에만 참여. 복제본(X) 140 MongoDB로배우는NoSQL
  • 141. 레플리카 셋replica sets members.push({ ... _id : 3, ... host : earth:10003, ... priority : 40 ... }); 141 MongoDB로배우는NoSQL
  • 142. 레플리카 셋replica sets 142 MongoDB로배우는NoSQL
  • 143. 레플리카 셋replica sets 143 MongoDB로배우는NoSQL
  • 144. 레플리카 셋replica sets 144 MongoDB로배우는NoSQL
  • 145. oplog •  operation log •  oplog.$main db.slaves.find() db.sources.find() db.runCommand({getLastError: 1, w: N}); db.printReplicationInfo(); 145 MongoDB로배우는NoSQL
  • 146. 샤딩 sharding 146 MongoDB로배우는NoSQL
  • 147. Sharding •  현재 장비에 디스크 공간이 부족할 때 •  단인 mongod가 처리할 때 보다 빠르게 데이터를 쓰고 싶을 때 •  성능 향상을 위해 더 많은 데이터를 메모 리에 올려 두고 싶을 때 147 MongoDB로배우는NoSQL
  • 148. Sharding 148 MongoDB로배우는NoSQL
  • 149. Shard key •  name •  timestamp •  category •  local •  level type •  etc 149 MongoDB로배우는NoSQL
  • 150. Autosharding •  Shard •  mongos •  config server 150 MongoDB로배우는NoSQL
  • 151. Autosharding •  설정서버 시작 •  $ mkdir -p ~/dbs/config •  $ ./mongod --dbpath ~/dbs/config --port 20000 •  mongos 기동 •  $ ./mongos --port 30000 --configdb localhost:20000 151 MongoDB로배우는NoSQL
  • 152. Autosharding •  샤드추가 •  $ mkdir -p ~/dbs/shard1 •  $ ./mongod --dbpath ~/dbs/shard1 --port 10000 •  $ ./mongo localhost:30000/admin db.runCommand({addshard : localhost:10000, allowLocal : true}) •  컬렉션을 샤딩으로 지정 db.runCommand({enablesharding : foo}) db.runCommand({shardcollection : foo.bar, key : {_id : 1}}) 152 MongoDB로배우는NoSQL
  • 153. Autosharding •  $ mkdir -p ~/dbs/config1 ~/dbs/config2 ~/dbs/config3 •  $ ./mongod --dbpath ~/dbs/config1 --port 20001 •  $ ./mongod --dbpath ~/dbs/config2 --port 20002 •  $ ./mongod --dbpath ~/dbs/config3 --port 20003 •  $ ./mongos --configdb localhost:20001,localhost:20002,localhost:2000 3 153 MongoDB로배우는NoSQL
  • 154. Autosharding db.shards.find() db.databases.find() db.chunks.find() db.printShardingStatus() db.runCommand({removeshard : localhost:10000}); db.runCommand({removeshard : localhost:10000}); 154 MongoDB로배우는NoSQL