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가 생성되었음을 확인할 수 있습니다.