Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[MongoDB] 일부 column만 수정하기 Computer & Program

MongoDB는 update를 하게 되면 해당 document의 내용이 모두 변경된다. 매번 update할 때 마다 변경하지 않는 column의 값을 가져와서 다시 update하기는 귀찮다. 게다가 더 큰 문제는 document를 가져온 다음에 다른 쪽에서 그 document를 수정해 버리면?? -ㅅ-;; 나는 예전 값을 update하게 된다.

이 때문에 Atomic Operation이 존재한다. 일부 column이나 배열에만을 update할 수도 있다.


여기서는 $set과 $unset, $inc만 소개하겠다. (나머지도 문서에 예제가 있으니 따라하면 쉽다.)

> db.catalog_config.save({"name":"Scott", "age":8});
> db.catalog_config.find();
{ "_id" : ObjectId("4f0bf9f5988b281ac4fa0e63"), "name" : "Scott", "age" : 8 }


8살짜리 Scott이라는 꼬마가 있다. 어느날 이 친구에게 별명이 생겼다. "Tiger"라는.. 별명을 update해주려고 아래처럼 update했더니.. 이런!! document 전체가 변경됐다!!

> db.catalog_config.update({"name":"Scott"}, {"aka":"Tiger"});
> db.catalog_config.find();
{ "_id" : ObjectId("4f0bf9f5988b281ac4fa0e63"), "aka" : "Tiger" }


기존에 있던 column들을 살리려면 update하기 전에 가져와야 한다. 헌데 구찮고, update하기 전에 다른 사람이 변경하면 큰 일이다. 물론, 다른 사람이 변경하기 전에 겁나 빨리하면 된다. :D

> db.catalog_config.update({"name":"Scott"}, {"name":"Scott", "age":8, "aka":"Tiger"});
{ "_id" : ObjectId("4f0bfae1988b281ac4fa0e64"), "name" : "Scott", "age" : 8, "aka" : "Tiger" }


이럴 때 $set이라는 Atomic Operation을 사용하면 된다. 우호~ 끝~!!

> db.catalog_config.update({"name":"Scott"}, {"$set":{"aka":"Tiger"}});
{ "_id" : ObjectId("4f0bfae1988b281ac4fa0e64"), "age" : 8, "aka" : "Tiger", "name" : "Scott" }




그리고 Scott이 다른 동네로 이사를 가게 돼서 별명이 없어졌다. 이럴 때도 마찬가지로 모든 column을 가져와서 update하지 말고 $unset을 사용하면 된다.

> db.catalog_config.update({"name":"Scott"}, {"$unset":{"aka":1}});
{ "_id" : ObjectId("4f0bfae1988b281ac4fa0e64"), "age" : 8, "name" : "Scott" }




어쩌다 보니 Scott이 한 번에 나이를 2살을 먹게 됐다. (설날에 떡국을 2그릇 먹었는지 =ㅅ=;;) 이 때는 $inc를 사용해서 숫자만 변경할 수 있다.

> db.catalog_config.update({"name":"Scott"}, {"$inc":{"age":2}});
{ "_id" : ObjectId("4f0bfae1988b281ac4fa0e64"), "age" : 10, "name" : "Scott" }


덧글

댓글 입력 영역

Google AdSense (text/image)