08. MongoDB Update Operators Part 5. - $pop, $pull
이번 포스팅에서는 $pop
operator와 $pull
operator를 이용하여 DB로부터 아이템을 삭제하는 법에 대해 알아보겠습니다.
우선 "$pop" operator는 특정 key의 아이템을 첫번째부터 또는 마지막부터 하나씩 삭제하는 명령어입니다.
{$pop : {key : 1}}
는 array 아이템의 맨 마지막으로부터 하나씩 삭제하며, {$pop : {key : -1}}
는 첫번째 아이템부터 하나씩 삭제합니다.
다음 예를 통해 자세히 알아보겠습니다. 우선 다음 명령어를 통해 아이템을 준비하겠습니다:
var user = {"username" : "gchoi", "age" : 37};
db.users.insert(user);
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "aaa@gmail.com"}});
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "bbb@gmail.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ccc@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ddd@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "eee@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "fff@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ggg@yahoo.com"}})
다음과 같이 아이템을 확인할 수 있습니다:
> db.users.find()
{ "_id" : ObjectId("52e496754f7969df59f1148c"), "age" : 37, "email" : [ "aaa@gmail.com", "bbb@gmail.com", "ccc@yahoo.com", "ddd@yahoo.com", "eee@yahoo.com", "fff@yahoo.com", "ggg@yahoo.com" ], "username" : "gchoi" }
다음 명령어를 반복적으로 입력하여 아이템이 맨 마지막부터 삭제되는 것을 확인힙니다:
($pop
의 key 값이 "1"임에 주목합니다.)
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4976b91525ea329493cc2"),
"age" : 37,
"email" : [
"aaa@gmail.com",
"bbb@gmail.com",
"ccc@yahoo.com",
"ddd@yahoo.com",
"eee@yahoo.com",
"fff@yahoo.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4976b91525ea329493cc2"),
"age" : 37,
"email" : [
"aaa@gmail.com",
"bbb@gmail.com",
"ccc@yahoo.com",
"ddd@yahoo.com",
"eee@yahoo.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4976b91525ea329493cc2"),
"age" : 37,
"email" : [
"aaa@gmail.com",
"bbb@gmail.com",
"ccc@yahoo.com",
"ddd@yahoo.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4976b91525ea329493cc2"),
"age" : 37,
"email" : [
"aaa@gmail.com",
"bbb@gmail.com",
"ccc@yahoo.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4976b91525ea329493cc2"),
"age" : 37,
"email" : [
"aaa@gmail.com",
"bbb@gmail.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4976b91525ea329493cc2"),
"age" : 37,
"email" : ["aaa@gmail.com"],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4976b91525ea329493cc2"),
"age" : 37,
"email" : [ ],
"username" : "gchoi"
}
위와 같이 "email" 아이템이 맨 마지막 아이템부터 하나씩 사라지는 것을 확인할 수 있을 것입니다.
이번에는 $pop
key 값을 "-1"로 테스트하여 아이템을 앞에서부터 하나씩 삭제해 보겠습니다.
앞서 예와 마찬가지로 아이템을 준비하겠습니다 (users
컬렉션 중복을 막기위해 drop()
함수를 이용하여 users
컬렉션을 삭제하였습니다).
db.users.drop()
var user = {"username" : "gchoi", "age" : 37};
db.users.insert(user);
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "aaa@gmail.com"}});
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "bbb@gmail.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ccc@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ddd@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "eee@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "fff@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ggg@yahoo.com"}})
$pop
key 값을 "-1"로 하여 반복적으로 실행하여 첫번째 아이템부터 삭제되는 것을 확인해 봅니다:
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [
"aaa@gmail.com",
"bbb@gmail.com",
"ccc@yahoo.com",
"ddd@yahoo.com",
"eee@yahoo.com",
"fff@yahoo.com",
"ggg@yahoo.com
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [
"bbb@gmail.com",
"ccc@yahoo.com",
"ddd@yahoo.com",
"eee@yahoo.com",
"fff@yahoo.com",
"ggg@yahoo.com
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [
"ccc@yahoo.com",
"ddd@yahoo.com",
"eee@yahoo.com",
"fff@yahoo.com",
"ggg@yahoo.com
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [
"ddd@yahoo.com",
"eee@yahoo.com",
"fff@yahoo.com",
"ggg@yahoo.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [
"eee@yahoo.com",
"fff@yahoo.com",
"ggg@yahoo.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [
"fff@yahoo.com",
"ggg@yahoo.com"
],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [ "ggg@yahoo.com" ],
"username" : "gchoi"
}
> db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}})
> db.users.find().pretty()
{
"_id" : ObjectId("52e4b9274d7acd666141a744"),
"age" : 37,
"email" : [ ],
"username" : "gchoi"
}
이번에는 $pull
operator를 이용하여 특정 아이템을 삭제해 보도록 합니다. 역시 마찬가지로 데이터를 먼저 준비하겠습니다:
db.users.drop()
var user = {"username" : "gchoi", "age" : 37};
db.users.insert(user);
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "aaa@gmail.com"}});
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "bbb@gmail.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ccc@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ddd@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "eee@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "fff@yahoo.com"}})
db.users.update({"username" : "gchoi"}, {$addToSet : {"email" : "ggg@yahoo.com"}})
$pull
operator로부터 "email"의 "ddd@yahoo.com"을 삭제해 보겠습니다. 다음 명령어를 입력합니다:
db.users.update({"username" : "gchoi"}, {$pull : {"email" : "ddd@yahoo.com"}})
결과를 확인해 보면 "email" 중 "ddd@yahoo.com"이 삭제되었음을 확인할 수 있습니다:
> db.users.find().pretty()
{
"_id" : ObjectId("52e4be914d7acd666141a746"),
"age" : 37,
"email" : [
"aaa@gmail.com",
"bbb@gmail.com",
"ccc@yahoo.com",
"ddd@yahoo.com",
"eee@yahoo.com",
"fff@yahoo.com",
"ggg@yahoo.com"
],
"username" : "gchoi"
}