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