07. MongoDB Update Operators Part 4. - $addToSet

지난 포스팅에서 $push operator를 통해 동일한 아이템을 추가할 경우 중복적으로 추가됨을 살펴 보았습니다.

만약 동일한 아이템을 추가할 때 중복적으로 추가하지 않도록 하려면 $addToSet operator를 사용하면 됩니다.

우선 다음과 같이 데이터를 준비해 보겠습니다.

use foobar

var user = {"username" : "gchoi", "age" : 37};
db.users.insert(user);

db.users.update(
  {"username" : "gchoi"},
  {$push : {"email" : "gchoi@gmail.com"}}
);

결과를 확인해 보면 다음과 같습니다:

> db.users.find().pretty()
{
  "_id" : ObjectId("52e3d4dd623bbd008840d671"),
  "age" : 37,
  "email" : [  "gchoi@gmail.com" ],
  "username" : "gchoi"
}

이제 다음과 같이 입력해 보겠습니다. $push 대신 $addToSet operator가 사용되었음을 유의하시기 바랍니다.

db.users.update(
  {"username" : "gchoi"},
  {$addToSet : {"email" : "gchoi@gmail.com"}}
)

결과를 확인해 보면 동일한 "email"이 한 번 더 추가되었음에도 결과에서는 중복적으로 추가되지 않았음을 확인할 수 있습니다:

> db.users.find().pretty()
{
  "_id" : ObjectId("52e3d4dd623bbd008840d671"),
  "age" : 37,
  "email" : [  "gchoi@gmail.com" ],
  "username" : "gchoi"
}

$addToSet$each를 함께 사용하면 여러 개의 아이템을 한꺼번에 추가할 수 있습니다. 가령 여러 개의 "email"을 추가한다고 가정해 보겠습니다:

db.users.update(
  {"username" : "gchoi"},
  {"$addToSet" : {"email" : {"$each" : ["cinema4dr12@gmail.com", "cinema4d@yahoo.com", "cinema4d@aaa.com"]}}}
)

결과를 확인해 보겠습니다. 여러 개의 "email"이 한 번에 추가되었음을 확인할 수 있을 것입니다:

> db.users.findOne()
{
    "_id" : ObjectId("52e3d4dd623bbd008840d671"),
    "age" : 37,
    "email" : [
        "gchoi@gmail.com",
        "cinema4dr12@gmail.com",
        "cinema4d@yahoo.com",
        "cinema4d@aaa.com"
    ],
    "username" : "gchoi"
}