10. MongoDB Update Operators Part 7. - Updating Multiple Documents
이번 포스팅에서는 다중의 도큐먼트를 업데이트 하는 방법에 대하여 알아보겠습니다.
update
쿼리는 기본적으로 기준에 부합하는 첫번째 도큐먼트만 업데이트 합니다.
즉 기준에 부합하는 도큐먼트가 더 있을 경우 부합하는 첫번째 도큐먼트를 제외한 나머지 도큐먼트의 내용은 그대로 유지됩니다.
만약 기준에 부합하는 모든 도큐먼트를 업데이트하려면 update
의 네번째 파라미터를 "true"로 설정합니다.
우선 테스트용 데이터를 다음과 같이 준비하는데 고객의 이름과 생일을 입력해 보겠습니다:
db.customers.remove()
db.customers.insert({name: "gchoi", birthday:"08/22"})
db.customers.insert({name: "jmpark", birthday:"04/02"})
db.customers.insert({name: "tjkwak", birthday:"11/11"})
db.customers.insert({name: "hskim", birthday:"12/08"})
db.customers.insert({name: "dsha", birthday:"04/02"})
입력한 결과는 다음과 같습니다.
> db.customers.find()
{ "_id" : ObjectId("52ea464d5e3b86c2a7325073"), "name" : "gchoi", "birthday" : "08/22" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325074"), "name" : "jmpark", "birthday" : "04/02" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325075"), "name" : "tjkwak", "birthday" : "11/11" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325076"), "name" : "hskim", "birthday" : "12/08" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325077"), "name" : "dsha", "birthday" : "04/02" }
입력된 결과를 눈여겨 보면, "jmpark"과 "dsha"의 생일이 모두 "04/02"로 동일함을 알 수 있습니다.
생일이 "04/02"인 고객을 기준으로 검색해 보면,
> db.customers.find({"birthday" : "04/02"})
{ "_id" : ObjectId("52ea464d5e3b86c2a7325074"), "name" : "jmpark", "birthday" : "04/02" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325077"), "name" : "dsha", "birthday" : "04/02" }
예상대로 "jmpark"과 "dsha"가 검색되었습니다.
오늘이 4월2일이라고 하고 오늘이 생일인 두 명의 고객에 대해 "gift" key를 업데이트 해 보겠습니다:
db.customers.update({birthday : "04/02"}, {$set : {gift : "Happy Birthday!"}}, false, true)
만약 업데이트 된 도큐먼트에 대한 정보를 얻고자 한다면 getLastError
명령어를 입력한다.
> db.runCommand({getLastError : 1})
{
"updatedExisting" : true,
"n" : 2,
"connectionId" : 1,
"err" : null,
"ok" : 1
}
updatedExisting
값 true는 업데이트 된 도큐먼트가 존재함을 의미하며, n
값 2는 업데이트 된 도큐먼트의 수가 2개임을 의미합니다.
현재 업데이트 된 결과를 출력해 보면 다음과 같습니다:
> db.customers.find()
{ "_id" : ObjectId("52ea464d5e3b86c2a7325073"), "name" : "gchoi", "birthday" : "08/22" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325075"), "name" : "tjkwak", "birthday" : "11/11" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325076"), "name" : "hskim", "birthday" : "12/08" }
{ "_id" : ObjectId("52ea464d5e3b86c2a7325074"), "birthday" : "04/02", "gift" : "Happy Birthday!", "name" : "jmpark" }{ "_id" : ObjectId("52ea464d5e3b86c2a7325077"), "birthday" : "04/02", "gift" : "Happy Birthday!", "name" : "dsha" }
$set
update operator의 네번째 파라미터가 "true"로 설정했음을 주목합니다.
예상대로 birthday
key가 "04/02"로 되어있는 "jmpark"과 "dsha"에 gift
key가 생성되었음을 확인할 수 있습니다.