MongoDB

MongoDB Update Documents

macro 2011. 10. 13. 18:09
반응형

이번에는 저장되어 있는 데이터를 업데이트하는 방법이다. 업데이트는 update 함수를 이용한다.

  • update() 함수
    • 몽고디비의 update()함수를 이용한다. 여기에 4개의 아규먼트가 들어간다.
    • criteria, objNew, upsert, multi
      • criteria 
        • 업데이트 하고싶은 레코드를 쿼리하는데 사용된다.
      • objNew
        • 업데이트할 데이터를 위해 사용
      • upsert
        • 업데이트 하고픈 해당 레코드가 있으면, 그레코드값을 업데이트하고, 없으면 새로 만들어서 업데이트한다.
      • multi
        • 업데이트하기 위해 매칭된 모든 다큐먼트를 업데이트 하거나, 아니면 하나의 다큐먼트만 업데이트 한다.
        • 디폴트는 하나의 다큐먼트만 업데이트 함.
        • $ 오퍼레이터로 동작함.
  • 쉘에서의 예
    • db.media.update( { "Title" : "Matrix, the"}, {"Type" : "DVD", "Title" :"Matrix, the", "Released" : "1999", "Genre" : "Action"}, true)
      • 위의 예는 Title 이 Matrix, the 인 다큐먼트를 찾아서
      • 모든 저장되어 있던 데이터를 지워버리고,
      • "Type" : "DVD", "Title" :"Matrix, the", "Released" : "1999", "Genre" : "Action" 이 값으로 세로 셋팅한다.
    • 위의 예에서 세번째 인자인 true 는 upsert를 의미한다.
    • 위의 예의 문제점
      • 원래 저장되어 있던 값은 그대로 두고, 원하는 필드값만 바꾸고자 한다면 다음과 같이 사용한다.
  • 기존 데이터를 지우지 않고 원하는 업데이트 하기.
    • 숫자 값을 증가시키기 $inc
      • 현재 다큐멘트에 count 라는 필드가 있고, 이를 하나씩 증가시키고 싶을때가 있다.
      • 이때, 저장되어 있는 값을 불러서 count = count +1 과 같은 생각을 할 필요없이
      • 자동으로 증가시켜 주는, $inc를 사용한다. 이것은 위에서 설명한 업데이트 함수에서 두번째 아규먼트 자리에서 사용한다.
      • 예)
        • db.media.update ( { "Title" : "One Piece"}, {$inc: {"count " : 4} } )
        • 타이틀이 원피스인 다큐먼트를 찾아서, 그안에 count 라는 필드값을 4만큼 증가시킨다.
        • 즉, count 가 얼마인지 확인할 필요없이, 그 저장되어있는 Read값에 4만큼 자동 증가시킴.
    • 원하는 필드값만 바꾸기 $set
      • 현재 다큐먼트에 nick_name 이라는 필드를 포함하여 여러 필드가 존재하는 경우.
      • nick_name 만 새로운 값으로 셋팅하고 싶을때
      • $set 을 이용하여, 업데이트 함수의 두번째 아규먼트에서 사용한다.
      • 예)
        • db.user.update ( { "id" : aa@aaa.com }, {$set : { nick_name : "macro" } } )
        • id 가 aa@aaa.com 인 다큐먼트를 찾아서, 기존데이터는 그대로 두고, 닉네임만 바꾼다.
    • 원하는 필드만 없애기 $unset
      • 현재 다큐먼트에 nick_name필드를 더이상 사용하지 않아서 없애는 경우
      • $unset 을 사용한다.
      • 예)
        • db.user.update ( { "id" : aa@aaa.com }, {$unset : { nick_name : "macro" } } )
        • 닉네임 필드만 삭제된다.
    • 필드가 배열로 되어있고, 이 배열에 값을 업데이트 할 경우
      • 필드가 배열이 아닌데, 추가하려고 하면 에러가 난다.
      • $push : 기존 배열 필드에 값을 추가한다. 한번에 하나의 값을 추가할때 사용
      • $pushAll : 기존 배열 필드에 여러 값(배열)을 한번에 추가.
      • $pop : 배열 필드에서 값을 하나 제거한다. 맨앞이나 맨뒤 하나.
        • {$pop : {favorite : 1}} : favorite 배열에서 맨끝의 값을 제거
        • {$pop : {favorite : -1}} : favorite 배열에서 맨앞의 값을 제거
      • $pull : 원하는 값을 배열에서 뺀다.
        • {$pull : {favorite : "abd"}} : favorite 배열에서 abd 를 제거
      • $pullAll : 원하는 값들을 배열에서 제거
        • {$pullAll : {favorite : ["Griffin, Louis","Griffin, Peter","Griffin, Brian"] }
  • 복합적인 사용
    • update함수의 두번째 아규먼트에, 바로 위에서 설명한 것들을 콤마 를 이용해서 적어주면 된다.
    • db.media.update( { "Title" : "Matrix, the"}, {$set : {"Type" : "DVD", "Title" :"Matrix, the"}, $inc :{ count : 2}}, true)
반응형