35
MongoDB 3. 문서의 생성, 갱신, 삭제 김홍준 twitter.com/jun0683 2011년 7월 23일 토요일

Mongo db문서의생성,갱신,삭제

  • Upload
    -

  • View
    823

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Mongo db문서의생성,갱신,삭제

MongoDB3. 문서의 생성, 갱신, 삭제

김홍준twitter.com/jun0683

2011년 7월 23일 토요일

Page 2: Mongo db문서의생성,갱신,삭제

들어가기

• 컬렉션에 새 문서 추가하기

• 컬렉션에 문서 삭제하기

• 기존문서 갱신하기

• 안전성과 속도 중 맞는 수준 선택하기

2011년 7월 23일 토요일

Page 3: Mongo db문서의생성,갱신,삭제

기본적인 방법insert 메소드

> db.foo.insert({"bar" : "baz"})

“_id”는 문서에 자동으로 추가

1. 문서의 삽입과 저장

2011년 7월 23일 토요일

Page 4: Mongo db문서의생성,갱신,삭제

일괄삽입

여러 문서를 삽입할때 일괄삽입일괄 삽입은 오버해드 X

한개씩 보다 빠름16MB보다 큰 메시지는 허용 X

커맨드 라인 도구 있음(http://www.mongodb.org/display/DOCS/Import+Export+Tools)

1. 문서의 삽입과 저장

2011년 7월 23일 토요일

Page 5: Mongo db문서의생성,갱신,삭제

내부 작동과 그 영향

드라이버가 데이터를 BSON 구조체로 변환후 데이터 베이스로 전송문서크가 4MB를 넘지 않는지만 확인드라이버가 유효성 검증(크기,UTF-8,데이터형)

1. 문서의 삽입과 저장

2011년 7월 23일 토요일

Page 6: Mongo db문서의생성,갱신,삭제

컬렉션에 있는 모든 문서 지우기> db.users.remove()

선택적 쿼리로 문서 지우기> db.mailing.list.remove({"opt-out" : true})

한번 데이터가 지워지면 영원히 삭제

2. 문서 삭제

2011년 7월 23일 토요일

Page 7: Mongo db문서의생성,갱신,삭제

삭제 속도

백만개의 문서를 모두 삭제 할때remove() 와 find_one()를 사용하기 보다는db.drop_collection(“이름”)으로 사용하면빠름

2. 문서 삭제

2011년 7월 23일 토요일

Page 8: Mongo db문서의생성,갱신,삭제

update 메소드를 사용해서 변경필요한 파라메터어떤 문서를 갱신 한 것인지에 대한 쿼리 문서문서를 어떻게 변경할지 설명하는 수정 문서

3. 문서 갱신

2011년 7월 23일 토요일

Page 9: Mongo db문서의생성,갱신,삭제

문서 치환3. 문서 갱신

{ "_id" : ObjectId("4b2b9f67a1f631733d917a7a"), "name" : "joe", "friends" : 32, "enemies" : 2}

{ "_id" : ObjectId("4b2b9f67a1f631733d917a7a"), "username" : "joe", "relationships" : { "friends" : 32, "enemies" : 2 }}

2011년 7월 23일 토요일

Page 10: Mongo db문서의생성,갱신,삭제

문서 치환3. 문서 갱신{ "_id" : ObjectId("4b2b9f67a1f631733d917a7a"), "name" : "joe", "friends" : 32, "enemies" : 2}

{ "_id" : ObjectId("4b2b9f67a1f631733d917a7a"), "username" : "joe", "relationships" : { "friends" : 32, "enemies" : 2 }}

> var joe = db.users.findOne({"name" : "joe"}); > joe.relationships = {"friends" : joe.friends, "enemies" : joe.enemies};{ "friends" : 32, "enemies" : 2}

> joe.username = joe.name; "joe" > delete joe.friends; true> delete joe.enemies; true > delete joe.name; true> db.users.update({"name" : "joe"}, joe);

2011년 7월 23일 토요일

Page 11: Mongo db문서의생성,갱신,삭제

제한자 사용법3. 문서 갱신

갱신제한자키 변경,추가,제거배열과 내장 문서 조작

에 사용되는 특수 키_id 값은 변경 할수 없음

2011년 7월 23일 토요일

Page 12: Mongo db문서의생성,갱신,삭제

$set제한자 사용법3. 문서 갱신

키 값을 설정, 키가 존재하지 않으면 생성> db.users.findOne(){ "_id" : ObjectId("4b253b067525f35f94b60a31"), "name" : "joe", "age" : 30, "sex" : "male", "location" : "Wisconsin"}

> db.users.update({"_id" : ObjectId("4b253b067525f35f94b60a31")}, ... {"$set" : {"favorite book" : "war and peace"}})

> db.users.findOne(){ "_id" : ObjectId("4b253b067525f35f94b60a31"), "name" : "joe", "age" : 30, "sex" : "male", "location" : "Wisconsin", "favorite book" : "war and peace"}

2011년 7월 23일 토요일

Page 13: Mongo db문서의생성,갱신,삭제

$set제한자 사용법3. 문서 갱신

키의 데이터형 변경

> db.users.update({"name" : “joe”}, ... {"$set" : "favorite book" : ["war and peace","foundation trilogy", "ender's game"]})

2011년 7월 23일 토요일

Page 14: Mongo db문서의생성,갱신,삭제

$set제한자 사용법3. 문서 갱신

내장 문서 내부 데이터 변경> db.blog.posts.findOne(){ "_id" : ObjectId("4b253b067525f35f94b60a31"), "title" : "A Blog Post", "content" : "...", "author" : { "name" : "joe", "email" : "[email protected]" }}> db.blog.posts.update({"author.name" : "joe"}, {"$set" : {"author.name" : "joe schmoe"}})

> db.blog.posts.findOne() { "_id" : ObjectId("4b253b067525f35f94b60a31"), "title" : "A Blog Post", "content" : "...", "author" : { "name" : "joe schmoe", "email" : "[email protected]" }}

2011년 7월 23일 토요일

Page 15: Mongo db문서의생성,갱신,삭제

$unset제한자 사용법3. 문서 갱신

키와 값 제거> db.users.findOne(){ "_id" : ObjectId("4b253b067525f35f94b60a31"), "name" : "joe", "age" : 30, "sex" : "male", "location" : "Wisconsin"}

> db.users.update({"name" : “joe”}, ... {"$unset" : {"location" : 1}})

> db.users.findOne(){ "_id" : ObjectId("4b253b067525f35f94b60a31"), "name" : "joe", "age" : 30, "sex" : "male", "location" : "Wisconsin", }

2011년 7월 23일 토요일

Page 16: Mongo db문서의생성,갱신,삭제

$inc제한자 사용법3. 문서 갱신

키 값을 설정, 키가 존재하지 않으면 생성숫자를 증감, 다른 데이터형 사용하면 실패

> db.games.insert({"game" : "pinball", "user" : "joe"})

> db.games.update({"game" : "pinball", "user" : "joe"}, ... {"$inc" : {"score" : 50}})

> db.games.find(){ "_id" : ObjectId("4b2d75476cc613d5ee930164"), "game" : "pinball", "name" : "joe", "score" : 50}

2011년 7월 23일 토요일

Page 17: Mongo db문서의생성,갱신,삭제

$inc제한자 사용법3. 문서 갱신

> db.games.update({"game" : "pinball", "user" : "joe"},... {"$inc" : {"score" : 10000}})

> db.games.find(){ "_id" : ObjectId("4b2d75476cc613d5ee930164"), "game" : "pinball", "name" : "joe", "score" : 10050}

> db.games.find(){ "_id" : ObjectId("4b2d75476cc613d5ee930164"), "game" : "pinball", "name" : "joe", "score" : 50}

2011년 7월 23일 토요일

Page 18: Mongo db문서의생성,갱신,삭제

$push제한자 사용법3. 문서 갱신

지정된 키가 존재하면 배열의 끝에 요소 추가없으면 새로운 배열 생성> db.blog.posts.findOne(){ "_id" : ObjectId("4b2d75476cc613d5ee930164"), "title" : "A blog post", "content" : "..."}

> db.blog.posts.update({"title" : "A blog post"}, {$push : {"comments" : ... {"name" : "joe", "email" : "[email protected]", "content" : "nice post."}}}) > db.blog.posts.findOne() { "_id" : ObjectId("4b2d75476cc613d5ee930164"), "title" : "A blog post", "content" : "...", "comments" : [ { "name" : "joe", "email" : "[email protected]", "content" : "nice post." }]}

2011년 7월 23일 토요일

Page 19: Mongo db문서의생성,갱신,삭제

$ne제한자 사용법3. 문서 갱신

같은 값이 존재하지 않는 경우에만 배열에 추가> db.papers.update({"authors cited" : {"$ne" : "Richie"}},

... {$push : {"authors cited" : "Richie"}})

2011년 7월 23일 토요일

Page 20: Mongo db문서의생성,갱신,삭제

$addToSet제한자 사용법3. 문서 갱신

같은 값이 존재하지 않는 경우에만 배열에 추가> db.users.findOne({"_id" : ObjectId("4b2d75476cc613d5ee930164")}){ "_id" : ObjectId("4b2d75476cc613d5ee930164"), "username" : "joe", "emails" : [ "[email protected]", "[email protected]", "[email protected]", ]}> db.users.update({"_id" : ObjectId("4b2d75476cc613d5ee930164")}, ... {"$addToSet" : {"emails" : "[email protected]"}})

> db.users.findOne({"_id" : ObjectId("4b2d75476cc613d5ee930164")}) { "_id" : ObjectId("4b2d75476cc613d5ee930164"), "username" : "joe", "emails" : [ "[email protected]", "[email protected]", "[email protected]", ]}

2011년 7월 23일 토요일

Page 21: Mongo db문서의생성,갱신,삭제

$addToSet제한자 사용법3. 문서 갱신

같은 값이 존재하지 않는 경우에만 배열에 추가> db.users.findOne({"_id" : ObjectId("4b2d75476cc613d5ee930164")}){ "_id" : ObjectId("4b2d75476cc613d5ee930164"), "username" : "joe", "emails" : [ "[email protected]", "[email protected]", "[email protected]", ]}> db.users.update({"_id" : ObjectId("4b2d75476cc613d5ee930164")}, ... {"$addToSet" : {"emails" : "[email protected]"}})

> db.users.findOne({"_id" : ObjectId("4b2d75476cc613d5ee930164")}) { "_id" : ObjectId("4b2d75476cc613d5ee930164"), "username" : "joe", "emails" : [ "[email protected]", "[email protected]", "[email protected]",

"[email protected]" ]}2011년 7월 23일 토요일

Page 22: Mongo db문서의생성,갱신,삭제

$each제한자 사용법3. 문서 갱신

여러개의 고유 값을 추가하기> db.users.update({"_id" : ObjectId("4b2d75476cc613d5ee930164")}, {"$addToSet" : ... {"emails" : {"$each" : ["[email protected]", "[email protected]", "[email protected]"]}}})

> db.users.findOne({"_id" : ObjectId("4b2d75476cc613d5ee930164")}) { "_id" : ObjectId("4b2d75476cc613d5ee930164"), "username" : "joe", "emails" : [ "[email protected]", "[email protected]", "[email protected]", "[email protected]" "[email protected]" "[email protected]" ]}

2011년 7월 23일 토요일

Page 23: Mongo db문서의생성,갱신,삭제

$pop제한자 사용법3. 문서 갱신

스택이나 큐처럼 요소 제거하기

{$pop : {key : 1}} 배열의 끝부터 요소 제거

{$pop : {key : -1}} 배열의 처음부터 요소 제거

2011년 7월 23일 토요일

Page 24: Mongo db문서의생성,갱신,삭제

$pull제한자 사용법3. 문서 갱신

지정된 조건에 의해 제거하기> db.lists.insert({"todo" : ["dishes", "laundry", "dry cleaning"]})

> db.lists.update({}, {"$pull" : {"todo" : "laundry"}})> db.lists.find(){ "_id" : ObjectId("4b2d75476cc613d5ee930164"), "todo" : [ "dishes",

"laundry", "dry cleaning" ]}

2011년 7월 23일 토요일

Page 25: Mongo db문서의생성,갱신,삭제

배열의 위치 기반 변경제한자 사용법3. 문서 갱신

배열내의 여러값을 위치(배열의 인덱스 0을 기준) 또는 위치 연산자 “$” (쿼리 문서와 일치 하는 배열의 위치를 알아서 갱신)

> db.blog.posts.findOne(){ "_id" : ObjectId("4b329a216cc613d5ee930192"), "content" : "...", "comments" : [ {"comment" : "good post", "author" : "John", "votes" : 0}, {"comment" : "i thought it was too short", "author" : "Claire", "votes" : 3}, {"comment" : "free watches", "author" : "Alice", "votes" : -1} ]}

> db.blog.update({"post" : post_id}, ... {"$inc" : {"comments.0.votes" : 1}})

> db.blog.update({"comments.author" : "John"}, ... {"$set" : {"comments.$.author" : "Jim"}})

2011년 7월 23일 토요일

Page 26: Mongo db문서의생성,갱신,삭제

제한자의 속도제한자 사용법3. 문서 갱신

문서의 크기를 변경할 필요가 없고 키값하는 제한자 빠름문서의 크기를 변경할 수 있는 제한자 느림

변경 없는 $inc 썼을때 7.33초변경 있는 $push 썼을때 67.58초

10만번 update

2011년 7월 23일 토요일

Page 27: Mongo db문서의생성,갱신,삭제

갱신입력3. 문서 갱신

갱신 조건에 일치하는 문서가 발견되지 않으면, 쿼리 문서와 갱신 문서를 합쳐 새로운 문서를 생성하기

blog = db.analytics.findOne({url : "/blog"})if (blog) { blog.pageviews++; db.analytics.save(blog);} else { db.analytics.save({url : "/blog", pageviews : 1})}

db.analytics.update({"url" : "/blog"}, {"$inc" : {"visits" : 1}}, true)

[쿼리], [갱신], [입력갱신여부]

2011년 7월 23일 토요일

Page 28: Mongo db문서의생성,갱신,삭제

저장 쉘 도우미3. 문서 갱신

save는 존재하지 않을 경우, 문서를 삽입하거나 존재할 경우 문서를 갱신할 수 있는 쉘 함수

> var x = db.foo.findOne() > x.num = 42 42 > db.foo.save(x)

db.foo.update({"_id" : x._id}, x)

2011년 7월 23일 토요일

Page 29: Mongo db문서의생성,갱신,삭제

다중문서 갱신3. 문서 갱신

save는 존재하지 않을 경우, 문서를 삽입하거나 존재할 경우 문서를 갱신할 수 있는 쉘 함수

[쿼리], [갱신], [입력갱신여부],[다중문서갱신여부]

> db.users.update({birthday : "07/23/2011"}, ... {$set : {gift : "Happy Birthday!"}}, false, true)

2011년 7월 23일 토요일

Page 30: Mongo db문서의생성,갱신,삭제

갱신한 문서의 반환(findAndModify)3. 문서 갱신

읽은 후 쓰기 형태의 원자적 연산이 필요한 경우 사용> 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"}})

> ps = db.runCommand({"findAndModify" : "processes", ... "query" : {"status" : "READY"}, ... "sort" : {"priority" : -1}, ... "update" : {"$set" : {"status" : "RUNNING"}}).value > do_something(ps)> db.process.update({"_id" : ps._id}, {"$set" : {"status" : "DONE"}})

2011년 7월 23일 토요일

Page 31: Mongo db문서의생성,갱신,삭제

갱신한 문서의 반환(findAndModify)3. 문서 갱신

update , remove 중 하나는 반드시 포함, 둘다 포함은 안됨

일치하는 문서가 없으면 명령어 오류 반환

한번에 한 문서만 갱신,제거

갱신 입력을 사용 할수 없고 오직 존재하는 문서만 갱신 가능

2011년 7월 23일 토요일

Page 32: Mongo db문서의생성,갱신,삭제

4. 데이터 베이스 중 가장 빠른 쓰기 연산

insert,remove,update는 데이터베이스의 응답을 기다리지 않음

발사 후 망각, 비동기는 아님

성공,실패와 같은 응답을 받을 일이 없다.

장점은 연산속도가 굉장히 빠름

별일 없으면 잘 돌아감, 그래도 안전하지는 않음

2011년 7월 23일 토요일

Page 33: Mongo db문서의생성,갱신,삭제

안전 연산4. 데이터 베이스 중 가장 빠른 쓰기 연산

getLastError명령어를 수행해 성공 여부를 확인

드라이버는 DB의 응답을 기다린 후 적절한 오류를 처리 해서 예외 처리가 가능한 예외를 던짐

안전한 연산을 수행하면 성능 희생

2011년 7월 23일 토요일

Page 34: Mongo db문서의생성,갱신,삭제

정상적인 오류 처리4. 데이터 베이스 중 가장 빠른 쓰기 연산

중복된 _id키를 가지는 문서를 삽입할때 오류 발생

안전하지 않은 모드에서는 DB의 아무런 응답이 없기 떄문에 삽입이 실패했는지 모름

배포시에는 지우더라도 개발하는 동안에는 모든 연산을 안전 연산으로 쓸것

2011년 7월 23일 토요일

Page 35: Mongo db문서의생성,갱신,삭제

5. 요청과 연결

MongoDB는 서버의 각 연결별로 DB는 요청을 위한 큐를 만듬

하나의 연결에 하나의 큐가 할당

하나의 쉘에서 삽입을 실행하면 다른 쉘에서 수행한 다음 쿼리에서 삽입한 문서를 반환 하지 않을수도 있음

루비,파이선,자바 드라이버는 연결 풀을 사용함

2011년 7월 23일 토요일