함께 성장하는 프로독학러

4. Document 를 수정, update() 메소드 본문

Programming/MongoDB

4. Document 를 수정, update() 메소드

프로독학러 2018. 5. 6. 22:08

안녕하세요, 프로독학러 입니다. 


이번 포스팅에서는 이미 작성된 Document 를 수정하는 메소드인 update() 메소드에 대해서 알아보도록 하겠습니다.


표현식


update() 메소드의 표현식은 다음과 같습니다.


db.COLLECTION_NAME.update( <query>, <update>, <options> )


첫 번째 파라미터인 query 는 find() 메소드의 query 와 같습니다. update 할 대상을 찾는 것으로, 데이터 타입은 document(객체) 입니다.

<도큐먼트를 검색하는, find() 메소드>

두 번째 파라미터인 update 는 qurey 를 기준으로 선택된 도큐먼트에 적용할 변동사항입니다. 데이터 타입은 document(객체) 입니다.

세 번째 파라미터인 options 는 객체 형식이며 세부 옵션은 다음과 같습니다. (*optional)


{

upsert : <boolean>,

multi : <boolean>,

writeConcern : <document>

}


upsert 의 값이 true 이면, update() 메소드의 첫 번째 인자로 들어온 qurey 로 검색된 도큐먼트가 존재하지 않는다면 두 번째 인자 (update) 로 새로운 도큐먼트를 만듭니다. (기본값 - false)

multi 의 값이 true 면, qurey 를 만족하는 여러 도큐먼트들을 수정합니다. (기본값 - false, 한 개의 데이터만 수정)

writeConcern 의 값은 document 형식으로, 도큐먼트를 업데이트 할 때 필요한 설정값을 지정하는 것입니다. 자세한 내용은 MongoDB 의 메뉴얼을 참고하시길 바랍니다.


샘플데이터 추가


예제를 통해 update 메소드를 연습하기 위해 아래와 같이 people 컬렉션에 도큐먼트들을 추가합니다.


db.people.insert( [

    { name: "Abet", age: 19 },

    { name: "Betty", age: 20 },

    { name: "Charlie", age: 23, skills: [ "mongodb", "nodejs"] },

    { name: "David", age: 23, score: 20 }

])


데이터를 추가했으면 update() 메소드를 통해 수정해 보도록 하겠습니다.


예제


ex1) 특정 field 업데이트 하기 - $set 연산자 사용


people 컬렉션의 도큐먼트들 중 name 필드의 값이 Abet 인 도큐먼트의 age 값을 20 으로 수정


db.people.update( { name:"Abet"}, { $set : { age : 20 } } )



$set 메소드를 이용하면 기존에 있는 필드의 값을 수정하는 것 뿐 아니라, 도큐먼트에 새로운 필드를 추가할 수도 있습니다.


db.people.update( { name:"Abet"}, { $set : { nickName : "Alpha" } } )



ex2) document 를 새로운 document 로 대체하기


기존의 document 를 새로운 document 로 대체하려면, update() 메소드의 두 번째 인자로 대체될 document 를 주면 됩니다.


db.people.update( { name : "Betty" }, { name : "Betty 2nd", age : 1 } )



{ "name" : "Betty", "age" : 20 } 이었던 도큐먼트를 { "name" : "Betty 2nd", "age" : 1 } 로 대체했습니다.

*새로운 document 로 대체할 때 _id 값은 변경되지 않습니다.


ex3) 특정 필드 제거하기 - $unset 연산자 사용


특정 필드를 제거하려면 $unset 연산자를 사용합니다.

$unset 연산자의 값은 document(객체) 타입으로, KEY 에는 삭제할 field 를, value 에는 숫자 1을 넣습니다. 여기서 숫자 1은 true 를 의미합니다. (true 를 입력해도 상관없습니다)


db.people.update( { name : "David" }, { $unset : { score: 1 } } )



ex4) query 에 해당하는 document 가 존재하지 않을 경우 새로운 document 를 추가


query 에 해당하는 document 가 없을 경우 update() 메소드의 두 번째 인자로 들어오는 document 를 새로 추가하려면, update() 메소드의 옵션을 이용합니다.

이에 해당하는 옵션은 upsert 입니다.


db.people.update( { name : "Elly" }, { name : "Elly", age : 17 }, { upsert : true } )



name 필드의 값이 Elly 인 도큐먼트는 존재하지 않기에 새로운 도큐먼트를 추가했습니다.


ex5) 여러 document 의 특정 field 수정하기


people 콜렉션의 document 들 중, age 의 값이 20 보다 작거나 같은 document 들의 score 를 10으로 수정해 보겠습니다.

이 때 update()  메소드의 옵션 중 여러 document 를 수정하는 multi 옵션을 true 로 설정합니다.


db.people.update(

{ age: { $lte: 20 } },

{ $set: { score: 10 } },

{ multi: true }

)



ex6) 배열에 값 추가하기 - $push 연산자 사용


우리의 샘플 데이터 중, name 필드의 값이 "Charlie" 인 도큐먼트는 skills 필드를 갖고 있습니다.

해당 필드의 값은 배열로, 배열의 원소는 문자열이 들어있습니다.

이 도큐먼트에 skills 필드에 값을 추가해 보겠습니다.


db.people.update(

{ name : "Charlie" },

{ $push : { skills : "angularjs" } }

)



ex6-1) 배열에 값 여러개 추가, 정렬하기 - $each, $sort 연산자 


위의 예제에서 수정한 도큐먼트의 skills 필드에 여러개의 값을 추가하고, 이를 알파벳 순으로 정렬하려면 다음과 같이 명령어를 입력합니다.


db.people.update(

{ name : "Charlie" },

{ $push : { 

skills : {

$each : [ "c++", "java" ],

$sort : 1

}

}

)



명령의 결과는 위의 그림과 같습니다.

(c++, java 를 skills 필드에 추가하고 skills 필드의 값들을 오름차순으로 정렬)

*sort 의 값이 -1 이면 내림차순으로 정렬합니다.


ex7) 배열의 값 제거하기 - $pull 연산자 사용


위의 예제에서의 도큐먼트의 skills 필드의 값을 하나 제거하려면 어떻게 해야할까요?

$pull 연산자를 이용합니다.


db.people.update(

{ name: "Charlie" },

{ $pull: { skills: "mongodb" } }

)



ex7) 배열에서 여러개의 값 제거하기 - $pull, $in 연산자 사용


배열에서 여러개의 값을 제거하려면 $pull 연산자와 함께 비교연산자 중 하나인 $in 연산자를 사용합니다.


db.people.update(

{ name: "Charlie" },

{ $pull: { skills: { $in : [ "angularjs", "java" ] } } }

)




여기까지


document 를 수정하는 update 메소드에 대해서 알아보았습니다.

메소드의 첫 번째 인자는 수정할 document 를 선택하는 기준인 query document 가 오고,

두 번째 인자로는 수정할 내용의 document 가 옵니다.

이때 $set, $unset, $push, $pull 등의 연산자를 사용합니다.

메소드의 마지막 인자는 options document 로, 여러 document 를 수정하거나, 쿼리의 결과가 존재하지 않으면 새로운 document 를 추가하는 옵션 등이 있습니다.

여기까지의 메소드들을 이용하면 MongoDB 의 데이터를 핸들링하는데 부족함이 없을 것입니다.

만약 여기까지에 해당되지 않는 핸들링이 필요하다면 MongoDB 의 update operators 메뉴얼을 참고하시길 바랍니다.


감사합니다.


**참고 자료 (항상 감사드립니다)

https://velopert.com/545


*이 포스팅이 도움이 되셨다면 다녀가셨다는 표시로 공감 부탁드릴게요! (로그인 하지 않으셔도 공감은 가능합니다 ㅎㅎ)

Comments