MongoDB를 사용하는 경우 기존 값을 찾아 변경하는 방법 update()에 대하여 알아봅니다.



# MongoDB, update() 알아보기
먼저 값을 변경, 수정할 경우 update()를 사용합니다.

db.Collection.update({ matchQuery }, { updateQuery }, { optionQuery })


위는 간단한 사용 문법입니다. NoSQL을 어느 정도 알고 있다면 매우 익숙한 문법입니다. 그럼 각각 어떻게 사용하는지 알아봅니다.

먼저 위에서는 객체를 값으로 가지는 세 가지 arguments 인자를 사용하고 있습니다.

  • matchQuery // 원하는 값을 찾을 검색 쿼리
  • updateQuery // 일치하는 document(row)를 찾은 후 변경 할 쿼리를 입력
  • optionQuery // [옵션] 추가적으로 동작 방식 및 옵션을 사용

위에서 옵션을 사용하여 여러가지 선택 가능한 값 들을 추가하거나 설정할 수 있죠. 이때 가능한 옵션들은 아래와 같습니다.

1. upsert: <Boolean>
가장 많이 사용되는 upsert입니다. update와 insert를 합성한 단어로 만약 matchQuery에서 일치하는 결과가 없는 경우 새로운 값을 추가(insert)할 것인지의 여부를 선택할 수 있습니다. 값은 true / false로 설정하며 기본값은 false입니다.


2. multi: <Boolean>
이 값을 multi: true로 설정할 경우 여러개의 일치하는 document(row)가 존재할 경우 모두 변경할 수 있게 됩니다. 기본값은 false이며 하나의 document만 업데이트 합니다.


3. hint: <document: index>
hint값을 사용하면 특정 도큐멘트의 인덱스를 사용하여 찾거나 조작하는 것이 가능합니다.

그럼 아래부터는 간단한 예제들입니다.



# MongoDB update() 예제보기
간단한 예제를 만들고 그 결과를 알아보겠습니다. 먼저 아래와 같은 database에 visits라는 이름의 collection이 존재하는 경우를 예로 들어봅니다.

@ visits
{ "day" : "11", "month" : "04", "count" : 1 }
{ "day" : "12", "month" : "04", "count" : 15 }
{ "day" : "13", "month" : "04", "count" : 2 }
{ "day" : "14", "month" : "04", "count" : 4 }
{ "day" : "15", "month" : "04", "count" : 1 }

여기서 day 값이 15인 값을 찾아 count를 10으로 변경하고자 합니다. 어떻게 할까요?
db.visits.update({
  day: '15'
},
{
  month : "04",
  count : 10
})

이제 15인 값을 찾아 count가 10으로 변경되었는지 확인해보겠습니다.
...
{ "day" : "15", "month" : "04", "count" : 10 }

역시 잘 변경되어 있습니다. 그런데 여기서 주의할 점은 하나의 필드 count만 변경되는 것이 아니라 document 전체가 변경됩니다. 만약 오직 하나의 field만 변경하고 싶다면? 이때는 $set을 사용합니다.


! update에 $set 사용하기

즉 오직 하나의 필드만 변경하고 나머지 값을 모두 유지할 경우 $set을 사용하면 됩니다. 위의 예제에 $set을 사용하면 아래와 같은 쿼리를 작성할 수 있습니다.
db.visits.update({
  day: '15'
},
{
  $set: {
    count : 10
  }
})

이제 count값만 변경됩니다. 즉 전체 document가 변경되지 않으므로 다른 필드 값들이 동일할 때 $set을 사용하는 방법이 훨씬 효과적일 수 있습니다.


! update에 upsert 사용하기
이번 예제는 일치하는 쿼리가 없는 경우 새로운 값을 추가할 수 있는 옵션 쿼리를 사용하는 예제입니다. 
...
{ "day" : "14", "month" : "04", "count" : 4 }
{ "day" : "15", "month" : "04", "count" : 1 }

위에는 day가'16'인 값이 존재하지 않습니다. 이 경우 새로운 값을 추가할 수 있도록 upsert()를 사용하고자 합니다.
db.visits.update({
  day: '16'
},
{
  month : "04",
  count : 1
},
{
  upsert: true
})

다른 예제와 달리 세 번째 인자가 존재합니다. { upsert: true }가 바로 그 것입니다. 이제 아래와 같이 새로운 16값을 가진 document가 추가되었습니다.
...
{ "day" : "14", "month" : "04", "count" : 4 }
{ "day" : "15", "month" : "04", "count" : 1 }
{ "day" : "16", "month" : "04", "count" : 1 }


여기까지 몽고DB에서 값을 변경, 수정하기 위해서 사용하는 update()에 대하여 자세히 알아보았습니다.