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"
}