09. MongoDB Update Operators Part 6. - $upsert

이번 포스팅에서는 upsert에 대해 알아보겠습니다.

upsertupdate의 특별한 형태 (명령어는 아니며 DB의 컨셉)입니다.

update 기준에 일치하는 도큐먼트가 없을 경우 그 기준을 포함하는 도큐먼트로 업데이트합니다.

만약 일치하는 도큐먼트가 있을 경우 정상적으로 업데이트 됩니다.

$upsert는 컬렉션의 구조를 정하고 시작할 필요가 없기 때문에 편리하게 사용할 수 있습니다.

우선 다음과 같이 명령어를 입력해 보겠습니다:

db.math.remove()
db.math.update({"count" : 25}, {"$inc" : {"count" : 3}}, true)

첫번째 라인을 통해 math 컬렉션을 삭제(컬렉션이 존재할 경우 "true"를 컬렉션이 존재하지 않을 경우 "false"를 반환합니다)한 후, 두번째 라인에서 count가 "25"인 아이템에 "3"을 더합니다.

그러나, 첫번째 라인에서 math 컬렉션이 삭제되었으므로 count가 "25"인 아이템이 있을리 없습니다.

upsert 개념에 의해 이 아이템에 부합하는 기준이 없으므로 이 기준의 아이템을 생성하고 "3"을 더합니다.

결과는 다음과 같습니다:

> db.math.find()
{ "_id" : ObjectId("52ea31953c6feb42c96ad802"), "count" : 28 }

count가 "25"로 생성된 후 "3"이 더해진 결과입니다.

만약 동일한 명령을 한 번 더 실행하면 다음과 같이 아이템이 하나 더 생성될 것입니다.

> db.math.update({"count" : 25}, {"$inc" : {"count" : 3}}, true)
> db.math.find()
{ "_id" : ObjectId("52ea31953c6feb42c96ad802"), "count" : 28 }
{ "_id" : ObjectId("52ea37eb3c6feb42c96ad803"), "count" : 28 }