09. MongoDB Update Operators Part 6. - $upsert
이번 포스팅에서는 upsert
에 대해 알아보겠습니다.
upsert
는 update
의 특별한 형태 (명령어는 아니며 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 }