1. $inc
필요한 데이터를 넣어보자
> visit = {"url":"www.example.com", "pageviews":52}
{ "url" : "www.example.com", "pageviews" : 52 }
> db.analytics.insert(visit)
확인하고
> db.analytics.findOne()
{
"_id" : ObjectId("4e058777080005633f97f766"),
"url" : "www.example.com",
"pageviews" : 52
}
업데이트 하고
> db.analytics.update({"url":"www.example.com"},{"$inc":{"pageviews":1}})
다시 확인하면 1증가되어 있다.
> db.analytics.findOne()
{
"_id" : ObjectId("4e058777080005633f97f766"),
"url" : "www.example.com",
"pageviews" : 53
}
2. $set
우선 테스트할 사용자를 입력하고
> user = {"name":"joe", "age":30, "sex":"male", "location":"Wisconsin"}
{ "name" : "joe", "age" : 30, "sex" : "male", "location" : "Wisconsin" }
> db.users.insert(user)
확인하고
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"name" : "joe",
"age" : 30,
"sex" : "male",
"location" : "Wisconsin"
}
$set을 사용하여 사용자가 좋아하는 책을 자기 정보에 추가로 저장해 보자
> db.users.update({"_id" : ObjectId("4e0588a9080005633f97f767")},{"$set":{"favor
ite book": "war and peace"}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"favorite book" : "war and peace",
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
추가되었다.
만약 사용자가 다른 책을 좋아한다고 하면, $set은 값을 변경하는 데 쓸 수 있다.
> db.users.update({"name":"joe"},{"$set":{"favorite book":"green eggs and ham"}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"favorite book" : "green eggs and ham",
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
"$set"은 심지어 키의 데이터형도 변경할 수 있다. "favorite book" 키의 값에 배열을 입력할 수 있다.
> db.users.update({"name":"joe"},{"$set":{"favorite book":["cat's cradle", "foun
dation trilogy", "ender's game"]}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"favorite book" : [
"cat's cradle",
"foundation trilogy",
"ender's game"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
사용자가 책을 좋아하지 않는다는 것을 깨달았으면, "$unset"으로 키와 값을 모두 제거할 수 있다.
> db.users.update({"name":"joe"},{"$unset":{"favorite book":1}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
"$set"은 또한 내장 문서 내부의 데이터를 변경할 때 쓸수 있다.
테스트 할 데이터를 생성하고
> post = {"title":"A Blog Post", "content":"example content", "author":{"name":"
joe", "email":"joe@example.com"}}
{
"title" : "A Blog Post",
"content" : "example content",
"author" : {
"name" : "joe",
"email" : "joe@example.com"
}
}
> db.blog.posts.insert(post)
확인은 필수
> db.blog.posts.findOne()
{
"_id" : ObjectId("4e058c7a080005633f97f768"),
"title" : "A Blog Post",
"content" : "example content",
"author" : {
"name" : "joe",
"email" : "joe@example.com"
}
}
자!! $set을 이용해 수정
> db.blog.posts.update({"author.name":"joe"},{"$set":{"author.name":"joe schome"
}})
수정이 잘 되었나 확인
> db.blog.posts.findOne()
{
"_id" : ObjectId("4e058c7a080005633f97f768"),
"author" : {
"email" : "joe@example.com",
"name" : "joe schome"
},
"content" : "example content",
"title" : "A Blog Post"
}
* 키를 추가하고 변경하고 제거할 때 항상 $ 제한자를 사용해야 한다. 처음에는 사람들이 자주 하는 실수는 "foo"의 값을 "bar"로 설정하고 아래와 같이 갱신하는 것이다.
>db.coll.update(criteria, {"foo":"bar"})
위 명령은 의도대로 작동하지 않고, 조건에 맞는 문서를 {"foo":"bar"}로 완전히 대체한다. 개별 키/값 쌍을 수정할 때는 항상 $ 연산자를 사용하라.
증가와 감소
$inc 제한자는 이미 존재하는 키의 값을 변경하거나 새롭게 키를 생성하는 데 사용할 수 있다.
우선 변경할 데이터를 넣고
> db.games.insert({"game":"pinball", "user":"joe"})
확인
> db.games.findOne()
{
"_id" : ObjectId("4e05904f080005633f97f769"),
"game" : "pinball",
"user" : "joe"
}
그리고 업데이트
> db.games.update({"game":"pinball", "user":"joe"}, {"$inc":{"score":50}})
확인해 보면 키가 인서트되었다.
> db.games.findOne()
{
"_id" : ObjectId("4e05904f080005633f97f769"),
"game" : "pinball",
"score" : 50,
"user" : "joe"
}
한번 더 해보자
> db.games.update({"game":"pinball", "user":"joe"}, {"$inc":{"score":10000}})
> db.games.findOne()
{
"_id" : ObjectId("4e05904f080005633f97f769"),
"game" : "pinball",
"score" : 10050,
"user" : "joe"
}
$int 는 정수형, long형 또는 더블형의 값에만 사용할 수 있다. 키의 값은 반드시 숫자여야 한다.
배열 제한자
> db.blog.posts.findOne()
{
"_id" : ObjectId("4e058c7a080005633f97f768"),
"author" : {
"email" : "joe@example.com",
"name" : "joe schome"
},
"content" : "example content",
"title" : "A Blog Post"
}
존재하지 않는 "comments"배열을 생성하고 댓글을 넣을 수 있다.
> db.blog.posts.update({"title":"A Blog Post"}, {$push:{"comments":{"name":"joe"
, "email":"joe@example.com","content":"nice post."}}})
> db.blog.posts.findOne()
{
"_id" : ObjectId("4e058c7a080005633f97f768"),
"author" : {
"email" : "joe@example.com",
"name" : "joe schome"
},
"comments" : [
{
"name" : "joe",
"email" : "joe@example.com",
"content" : "nice post."
}
],
"content" : "example content",
"title" : "A Blog Post"
}
한번 더 넣어보자.
> db.blog.posts.update({"title":"A Blog Post"}, {"$push":{"comments":{"name":"bo
b", "email":"bob@example.com", "content":"good post."} }})
> db.blog.posts.findOne()
{
"_id" : ObjectId("4e058c7a080005633f97f768"),
"author" : {
"email" : "joe@example.com",
"name" : "joe schome"
},
"comments" : [
{
"name" : "joe",
"email" : "joe@example.com",
"content" : "nice post."
},
{
"name" : "bob",
"email" : "bob@example.com",
"content" : "good post."
}
],
"content" : "example content",
"title" : "A Blog Post"
}
일반적으로 같은 값이 존재하지 않는 경우에만 배열에 값을 추가한다. 이때는 쿼리문서에 "$ne"를 사용하면 된다.
이는 또한 "$addToSet"을 통해 가능하다.
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
> db.users.update({"name":"joe"},{"$addToSet":{"email":"joe@hotmail.com"}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
여러 개의 고유 값을 추가하기 위해서는 $addToSet과 $each를 결합해서 사용한다.
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
> db.users.update({"name":"joe"},{$addToSet:{"email":{$each:["joe@php.net", "joe
@example.com", "joe@python.org"]}}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com",
"joe@php.net",
"joe@python.org"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
배열에서 원하는 것을 제거해보자
$pull
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com",
"joe@php.net",
"joe@python.org"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
> db.users.update({"name":"joe"}, {$pull:{"email":"joe@example.com"}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com",
"joe@php.net",
"joe@python.org"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
$pop을 사용하여 배열 요소를 제거할 수도 있다.
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com",
"joe@php.net",
"joe@python.org"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
{$pop:{"email":1}} -> 배열의 끝부터 요소를 제거하고 {$pop:{"email":2}} 도 같은 효과
> db.users.update({"name":"joe"}, {$pop:{"email":1}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com",
"joe@php.net"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
{$pop:{"email":-1}} --> 배열의 처음부터 요소를 제거한다.
> db.users.update({"name":"joe"}, {$pop:{"email":-1}})
> db.users.findOne()
{
"_id" : ObjectId("4e0588a9080005633f97f767"),
"age" : 30,
"email" : [
"joe@yahoo.com",
"joe@hotmail.com",
"joe@php.net"
],
"location" : "Wisconsin",
"name" : "joe",
"sex" : "male"
}
배열의 위치 기반 변경
> db.blog.posts.findOne()
{
"_id" : ObjectId("4e058c7a080005633f97f768"),
"author" : {
"email" : "joe@example.com",
"name" : "joe schome"
},
"comments" : [
{
"name" : "joe",
"email" : "joe@example.com",
"content" : "nice post."
},
{
"name" : "bob",
"email" : "bob@example.com",
"content" : "good post."
},
{
"name" : "tazz",
"email" : "tazz@example.com",
"content" : "best one."
}
],
"content" : "example content",
"title" : "A Blog Post"
}
배열의 요소는 0부터 시작
> db.blog.posts.update({"title":"A Blog Post"},{$set:{"comments.2.content":"too
bad"}})
> db.blog.posts.findOne()
{
"_id" : ObjectId("4e058c7a080005633f97f768"),
"author" : {
"email" : "joe@example.com",
"name" : "joe schome"
},
"comments" : [
{
"name" : "joe",
"email" : "joe@example.com",
"content" : "nice post."
},
{
"name" : "bob",
"email" : "bob@example.com",
"content" : "good post."
},
{
"content" : "too bad",
"email" : "tazz@example.com",
"name" : "tazz"
}
],
"content" : "example content",
"title" : "A Blog Post"
}
>
update에서 세번째 인자값은 update 시 일치하는 값이 없으면 insert하라는 뜻
math collection을 싹 지우고
> db.math.remove()
> db.math.find()
그냥 업데이트는 아무런 변화가 없다.
> db.math.update({"count":25},{$inc:{"count":3}})
> db.math.find()
그러나 true인자를 넣어주면
insert 하고 update도 한다. 그래서 28이 된다.
> db.math.update({"count":25},{$inc:{"count":3}}, true)
> db.math.find()
{ "_id" : ObjectId("4e059e8dc4a6f6d20743bf3c"), "count" : 28 }
update에서 네번째 인자는 일치하는 다른 문서들도 갱신하라는 것.
기본적으로 update는 조건에 일치하는 첫번째 문서만 갱신한다.
'NoSql' 카테고리의 다른 글
mongodb conf 파일 (0) | 2011.06.28 |
---|---|
mongoDB 보안 관련 Tips (0) | 2011.06.28 |
mongdb 쉘 활용 팁 (0) | 2011.06.25 |
mongodb 간단 명령어 (0) | 2011.06.25 |
mongodb 설치 (0) | 2011.06.25 |