본문 바로가기

IT/Database

[mongodb] update , upsert

2012/10/19 18:39 NoSQL/MongoDB

안녕하세요. 이스트럭(강동운) 입니다.


오늘은 mongodb update에 대해서 알아볼까 합니다.


일반적으로 아시는 update에는 조건과 변경값만 있는지 아십니다.


idx가 1번인 값의 name을 eastluck으로 변경하라! 라고 본다면..  아래 쿼리와 같을 수 있겠죠~!


1
db.test.update({"idx":1}, {$set: {"name":"eastluck"}});



사실 update는 인자값이 두개가 아니라 원래는 총 4개가 있습니다.

db.test.update({조건}, {변경값}, true|false, true| false)  

1번인자: 조건

2번인자: 변경조건

3번인자: upsert (upsert란? 있으면 업데이트 없으면 insert 하라는 것입니다, 기본값 false)

4번인자: 멀티라인 조건여부(기본값 false)


1,2번은 우선 설명을 드렸고!

3번째 인자를 살펴보면... 있으면 업데이트.. 없으면 insert라고 얘기 드렸습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use test
db.test.drop();
db.test.insert({"idx": 1})
db.test.find();
--//입력 결과 확인
{ "_id" : ObjectId("50811cd4150da7bcd1e92041"), "idx" : 1 }
 
--//업데이트를 치면(upsert를 true를 줬으나 데이터가 있기 때문에 update)
db.test.update({"idx":1}, {$set : {"name":"eastluck"}}, true);
db.test.find();
--//수정 결과화면
{ "_id" : ObjectId("50811cd4150da7bcd1e92041"), "idx" : 1, "name" : "eastluck" }
 
--//수정이 된걸 보실 수 있죠! 이제 없는걸 수정해보죠~!
 
db.test.update({"idx":100}, {$set : {"name":"eastluck"}}, true);
db.test.find();
--//upsert 후 결과 화면(새로 추가된걸 보실 수 있습니다.)
 
{ "_id" : ObjectId("50811cd4150da7bcd1e92041"), "idx" : 1, "name" : "eastluck" }
{ "_id" : ObjectId("50811d3d4b6b41657f10bc49"), "idx" : 100, "name" : "eastluck" }



재미있죠? ^^; 이런 예제도 있습니다!

1
2
3
4
5
6
db.test.update({"count":100}, {$inc : {"count":3}}, true);
db.test.find();
--//결과화면
{ "_id" : ObjectId("50811cd4150da7bcd1e92041"), "idx" : 1, "name" : "eastluck" }
{ "_id" : ObjectId("50811d3d4b6b41657f10bc49"), "idx" : 100, "name" : "eastluck" }
{ "_id" : ObjectId("50811e1c4b6b41657f10bc4a"), "count" : 103 }


count가 100이라는 값이 없는데.. 거기다 3을 더하니.. 103이 입력이 되는 것입니다~^^ 물론 3번째 인자를 false로 넣으면 입력이 안되겠죠!


이제 마지막 연산자를 살펴보죠! 마지막 연산자는 멀티라인 조건입니다. 기본값으로 주면?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<p>// 테스트했던 컬렉션 삭제
db.test.drop()
 
// idx:가 1인 3개행 insert
db.test.insert({"idx": 1})
db.test.insert({"idx": 1})
db.test.insert({"idx": 1})
 
// update(멀티라인 true);
db.test.update({"idx":1}, {$set: {"name":"eastluck"}});
 
 
db.test.find()
//결과
{ "_id" : ObjectId("50811eca150da7bcd1e92043"), "idx" : 1 }
{ "_id" : ObjectId("50811eca150da7bcd1e92044"), "idx" : 1 }
{ "_id" : ObjectId("50811eca150da7bcd1e92042"), "idx" : 1, "name" : "eastluck" }
 
</p>

한 행만 수정된 걸 볼 수 있습니다. 따라서.. 이런 경우는 이렇게 하셔야 됩니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<p>// 테스트했던 컬렉션 삭제
db.test.drop()
 
// idx:가 1인 3개행 insert
db.test.insert({"idx": 1})
db.test.insert({"idx": 1})
db.test.insert({"idx": 1})
 
// update(멀티라인 false);
db.test.update({"idx":1}, {$set: {"name":"eastluck"}}, false, true);
 
 
db.test.find()
//결과
{ "_id" : ObjectId("50811f48150da7bcd1e92045"), "idx" : 1, "name" : "eastluck" }
{ "_id" : ObjectId("50811f48150da7bcd1e92046"), "idx" : 1, "name" : "eastluck" }
{ "_id" : ObjectId("50811f48150da7bcd1e92047"), "idx" : 1, "name" : "eastluck" }
 
</p>


update의 3번째 인자와 4번쨰 인자를 효과적으로 사용합시다 ^^

감사합니다. ^^


참고 URL: http://www.mongodb.org/display/DOCS/Updating



출처 : http://eastluck.tistory.com/50