12-12 04:59
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[MongoDB] Update Modifiers / Part 6. - $pop / $pull 본문

Data Science/MongoDB

[MongoDB] Update Modifiers / Part 6. - $pop / $pull

cinema4dr12 2014. 1. 26. 16:35

Written by cinema4d

이번 글에서는 "$pop" modifier와 "$pull" modifier를 통해 DB로부터 아이템을 삭제하는 법에 대해 알아보겠다.

우선 "$pop" modifier는 특정 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() { "_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() { "_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() { "_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() { "_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() { "_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() { "_id" : ObjectId("52e4976b91525ea329493cc2"), "age" : 37, "email" : [  "aaa@gmail.com" ], "username" : "gchoi" } > db.users.update({"username" : "gchoi"}, {$pop : {"email" : 1}}) > db.users.find() { "_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() { "_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() { "_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() { "_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() { "_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() { "_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() { "_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() { "_id" : ObjectId("52e4b9274d7acd666141a744"), "age" : 37, "email" : [  "ggg@yahoo.com" ], "username" : "gchoi" } > db.users.update({"username" : "gchoi"}, {$pop : {"email" : -1}}) > db.users.find() { "_id" : ObjectId("52e4b9274d7acd666141a744"), "age" : 37, "email" : [ ], "username" : "gchoi" }


이번에는 "$pull" modifier를 이용하여 특정 아이템을 삭제해 보도록 하자. 역시 마찬가지로 데이터를 먼저 준비한다.

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" modifier로부터 "email"의 "ddd@yahoo.com"을 삭제해 보자. 다음 명령어를 입력한다.

db.users.update({"username" : "gchoi"}, {$pull : {"email" : "ddd@yahoo.com"}})


결과를 확인해 보면 "email" 중 "ddd@yahoo.com"이 삭제되었음을 확인할 수 있다.

> db.users.find() { "_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" }


Comments