이번 강좌에서는 document를 수정하는 update() 메소드에 대하여 알아보도록 하겠습니다.
정의
MongoDB에서는 update() 메소드를 통하여 데이터를 수정 할 수 있습니다. 이 메소드의 구조는 다음과 같습니다:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
Collection 안의 document(들)을 수정합니다. 이 메소드를 통하여 특정 field 를 수정 할 수도 있고 이미 존재하는 document를 대체(replace) 할 수도 있습니다.
update() 메소드의 기본 옵션으로는 단 하나의 document를 수정합니다.
Parameter | Type | 설명 |
---|---|---|
*query | document | 업데이트 할 document의 criteria 를 정합니다. find() 메소드 에서 사용하는 query 와 같습니다. |
*update | document | document에 적용할 변동사항입니다. |
upsert | boolean | Optional. (기본값: false) 이 값이 true 로 설정되면 query한 document가 없을 경우, 새로운 document를 추가합니다. |
multi | boolean | Optional. (기본값: false) 이 값이 true 로 설정되면, 여러개의 document 를 수정합니다. |
writeConcern | document | Optional. wtimeout 등 document 업데이트 할 때 필요한 설정값입니다. 기본 writeConcern을 사용하려면 이 파라미터를 생략하세요. 자세한 내용은 매뉴얼을 참조해주세요. |
샘플 데이터 추가
update 메소드를 연습해보기 위해 샘플 데이터를 추가하세요.
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() 메소드 사용법을 배워보도록 하겠습니다.
예제1. 특정 field 업데이트 하기
// Abet document 의 age를 20으로 변경한다 > db.people.update( { name: "Abet" }, { $set: { age: 20 } } ) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
특정 field의 값을 수정할 땐 $set 연산자를 사용합니다. 이 연산자를 사용해서 똑같은 방법을 새로운 field를 추가 할 수도 있습니다.
예제2. document를 replace 하기
// Betty document를 새로운 document로 대체한다. > db.people.update( { name: "Betty" }, { "name": "Betty 2nd", age: 1 }) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
이렇게 새로운 document 로 replace 할 때, _id는 바뀌지 않습니다.
예제3. 특정 field를 제거하기
// David document의 score field를 제거한다 > db.people.update( { name: "David" }, { $unset: { score: 1 } } ) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
여기서 score: 1 의 1 은 true 의 의미입니다.
예제4. criteria에 해당되는 document가 존재하지 않는다면 새로 추가하기
// upsert 옵션을 설정하여 Elly document가 존재하지 않으면 새로 추가 > db.people.update( { name: "Elly" }, { name: "Elly", age: 17 }, { upsert: true } ) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("56c893ffc694e4e7c8594240") })
예제5. 여러 document의 특정 field를 수정하기
// age가 20 보다 낮거나 같은 document의 score를 10으로 설정 > db.people.update( ... { age: { $lte: 20 } }, ... { $set: { score: 10 } }, ... { multi: true } ... ) WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 0 })
예제6-1. 배열 에 값 추가하기
// Charlie document의 skills 배열에 "angularjs" 추가 > db.people.update( ... { name: "Charlie" }, ... { $push: { skills: "angularjs" } } ... ) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
예제6-2. 배열에 값 여러개 추가하기 + 오름차순으로 정렬하기
// Charlie document의 skills에 "c++" 와 "java" 를 추가하고 알파벳순으로 정렬 > db.people.update( ... { name: "Charlie" }, ... { $push: { ... skills: { ... $each: [ "c++", "java" ], ... $sort: 1 ... } ... } ... } ... ) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
$sort 값을 내림차순으로 정렬하려면 -1 로 하면 됩니다.
배열이 document의 배열이고 그 embedded document의 특정 field에 따라서 정렬을 할 때는 다음과 같이 설정하면 됩니다.
$sort: { KEY: 1 }
예제7-1. 배열에 값 제거하기
// Charlie document에서 skills 값의 mongodb 제거 > db.people.update( ... { name: "Charlie" }, ... { $pull: { skills: "mongodb" } } ... )
예제7-2. 배열에서 값 여러개 제거하기
// Charlie document에서 skills 배열 중 "angularjs" 와 "java" 제거 > db.people.update( ... { name: "Charlie" }, ... { $pull: { skills: { $in: ["angularjs", "java" ] } } } ... ) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
마무리하면서…
데이터를 수정하는 웬만한 케이스를 모두 다뤄보았습니다. 그러나 물론, 이 글에서 설명되지 않은 케이스들도 어느정도 있답니다. 위에 해당하지 않는 케이스가 있을 경우엔 매뉴얼을 참조해주세요.
다음 강좌에선 데이터 쿼리의 성능을 효율적으로 높여주는 Index 에 대하여 알아보도록 하겠습니다.