본문 바로가기
개발 Story/몽고디비

04. Mongodb - 자바스크립트 셸을 통한 맛보기(2)

by niee 2016. 11. 18.

2장 요약 -2

*요약2 시작전 간단히 짚고 넘어가보면 몽고디비의 셸은 자바스크립트 기반으로 만들어졌다.

때문에 사용하는 명령어는 모두 자바스크립트 기반의 함수인데 웹브라우저의 개발자모드를 자주 애용해본 분들은 알겠지만

자바스크립트 함수가 선언이 되어있다면, 함수명만 입력하면 해당함수가 어떤식으로 구현되어 있는지 개발자콘솔에서 볼수 있는데

몽고디비의 셸역시 같은 기능을 제공한다.

ex)find() 함수의 구현 확인

> use tutorial

switched to db tutorial

> db.users.find

function (query, fields, limit, skip, batchSize, options) {

    var cursor = new DBQuery(this._mongo,

                             this._db,

                             this,

                             this._fullName,

                             this._massageObject(query),

                             fields,

                             limit,

                             skip,

                             batchSize,

                             options || this.getQueryOptions());


    var connObj = this.getMongo();

    var readPrefMode = connObj.getReadPrefMode();

    if (readPrefMode != null) {

        cursor.readPref(readPrefMode, connObj.getReadPrefTagSet());

    }


    return cursor;

}

>

1. 간단한 쿼리 셀렉터(query selector)

- 앞 포스팅 마지막부분에도 나왔지만 도큐먼트를 가져오는 명령어는 find()이다. 

- find()는 관계형 데이터 베이스의 where절 같은 설렉터를 지정할수 있다.

- 원하는 셀렉터를 json형식으로 파라메터로 넘겨준다.

- 자바스크립트 셸 기반이기 때문에 json 변수를 선언후 넘겨줘도 된다.

ex1.) 사용자명이 niee인 도큐먼트 찾기 json바로 넘기기

> db.users.find({username:"niee"})

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "username" : "niee" }


ex2) 변수를 이용

> var param = {username:"niee"}

> db.users.find(param)

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "username" : "niee" }


- 생성된 도큐먼트의 갯수를 알고 싶을땐 count()를 사용

ex) users 컬렉션의 도큐먼트 갯수

> db.users.count()

1


- count()에도 셀렉터를 사용할 수 있다.

ex)

> db.users.count({username:"me"})

0

> db.users.count({username:"niee"})

1


2. 도큐먼트 업데이트

- 업데이트에는 최소 두개의 파라미터를 필요로 한다.

- 첫번째 파라미터는 업데이트할 도큐먼트를 찾을 파라미터

- 두번째 파라미터는 수정할 내용

- 지금 하는 방식은 타깃 수정(targeted modifications)

ex) niee사용자에 나이를 추가

> db.users.update({username:"niee"},{$set:{age:33}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

> db.users.find()

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "username" : "niee", "age" : 33  }


- $set 을 사용하면 해당하는 도큐먼트에 신규 추가되는 데이터 키가 있다면 해당키를 변경, 없으면 추가한다.

- $set 을 사용하지 않으면 기존 도큐먼트 내용은 사라지고 새로 덮어 써버린다.

ex)$set 없이 update()할경우

> db.users.update({username:"niee"},{age:33})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "age" : 33 }



3. 복잡한 도큐먼트 생성및 셀렉터와 업데이트

3-1) 복잡한 도큐먼트 생성

- users 컬렉션의 niee도큐먼트에 좀더 상세한 데이터를 추가해보면 아래처럼 추가 할 수 있다.

ex) 취미, 즐겨본 영화 등

> var movies = ["IRON MAN", "AVARTA", "007"]

> var hobby = ["JAVA", "MUSIC", "SPORT"]

> var nieeFavorites = {favorites : {movies:movies, hobby : hobby}}

> nieeFavorites

{

        "favorites" : {

                "movies" : [

                        "IRON MAN",

                        "AVARTA",

                        "007"

                ],

                "hobby" : [

                        "JAVA",

                        "MUSIC",

                        "SPORT"

                ]

        }

}

> db.users.update({username:"niee"},{$set:nieeFavorites})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

{

 "_id" : ObjectId("582d97626352953de1eb29d0"),

 "age" : 33,

 "username" : "niee",

 "favorites" : { "movies" : [ "IRON MAN", "AVARTA", "007" ], "hobby" : [ "JAVA", "MUSIC", "SPORT" ] } 

}

- 위에서 보이듯 도큐먼트에는 배열,새로운 오브젝트도 추가될수 있다.


3-2) 복잡한 도큐먼트 셀렉터

- 새성된 도큐먼트에서 hobby가 java인 사용자를 찾는 셀렉터를 사용해 보자

ex)

> db.users.find({"favorites.hobby":"JAVA"})

"_id" : ObjectId("582d97626352953de1eb29d0"), 

"age" : 33,

 "username" : "niee",

 "favorites" : { "movies" : [ "IRON MAN", "AVARTA", "007" ], "hobby" : [ "JAVA", "MUSIC", "SPORT" ] } 

}

- 셀렉터의 키값이 스트링인점에 주의하자, 자바스크립트를 많이 다뤄본 분들이라면 이해하기 쉬울것이다.

- 예시에서 보듯이 도큐먼트안의 오브젝트(favorites) 키(hobby)에 접근하기 위해선 닷(.)을 이용하여 접근한다.


3-3) 복잡한 도큐먼트 업데이트

- 위의 업데이트에선 업데이트시 $set을 사용 했었다.

ex)$set을 이용하여 hobby가 JAVA인 사용자의 hobby에 MONGODB를 추가해보자

> db.users.update({"favorites.hobby":"JAVA"}, {$set:{"favorites.hobby":"MONGODB"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

"_id" : ObjectId("582d97626352953de1eb29d0"),

 "age" : 33, 

"username" : "niee", 

"favorites" : { "movies" : [ "IRON MAN", "AVARTA", "007" ], "hobby" : "MONGODB" } 

}

- 위2번의 설명처럼 $set을 이용하면 MONGODB가 추가되지 않고, 기존 데이터를 변경해 버렸다.

- 이처럼 배열형식의 데이터추가를 할 때는 $addToSet, $push를 사용한다.

ex)$push을 이용하여 hobby가 JAVA인 사용자의 hobby에 MONGODB를 추가해보자

> db.users.update({username:"niee"}, {$set:{"favorites.hobby":["JAVA"]}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "age" : 33, "username" : "niee", "favorites" : { "movies" : [ "IRON MAN", "AVARTA", "007" ], "hobby" : [ "JAVA" ] } }

> db.users.update({"favorites.hobby":"JAVA"}, {$push:{"favorites.hobby":"MONGODB"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

{

 "_id" : ObjectId("582d97626352953de1eb29d0"), 

"age" : 33, 

"username" : "niee", 

"favorites" : { "movies" : [ "IRON MAN", "AVARTA", "007" ], "hobby" : [ "JAVA", "MONGODB" ] } 

}


ex)$addToSet을 이용하여 movies가 AVARTA인 사용자의 hobby에 JAVASCRIPT를 추가해보자

> db.users.update({"favorites.movies":"AVARTA"}, {$addToSet:{"favorites.hobby":"JAVASCRIPT"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

"_id" : ObjectId("582d97626352953de1eb29d0"), 

"age" : 33, 

"username" : "niee", 

"favorites" : { "movies" : [ "IRON MAN", "AVARTA", "007" ], "hobby" : [ "JAVA", "MONGODB", "JAVASCRIPT" ] } 

}


-$push와 $addToSet의 차이점은 $addToSet은 데이터를 추가할때 중복된값은 업데이트 하지 않는다.

ex)$addToSet을 이용하여 movies가 AVARTA인 사용자의 hobby에 JAVASCRIPT를 다시한번 추가해보자

> db.users.update({"favorites.movies":"AVARTA"}, {$addToSet:{"favorites.hobby":"JAVASCRIPT"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

"_id" : ObjectId("582d97626352953de1eb29d0"), 

"age" : 33, 

"username" : "niee", 

"favorites" : { "movies" : [ "IRON MAN", "AVARTA", "007" ], "hobby" : [ "JAVA", "MONGODB", "JAVASCRIPT" ] } 

}


- 몽고디비의 업데이트는 기본적으로 쿼리 셀렉터에 맞는 첫번째 도큐먼트에 대해서만 업데이트를 하는것이 기본 설정이다.

- 쿼리 셀렉터에 맞는 모든 도큐먼트를 업데이트 하기 위해선 4번째 파라미터로 true를 넘긴다.

ex) username이 niee인 사용자를 추가 후 해당 username을 가진 도큐먼트에 생년월일을 추가

> db.users.save({username:"niee"})

WriteResult({ "nInserted" : 1 })

> db.users.update({username:"niee"}, {$set:{birthday:"1984/12/15"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "username" : "niee", "age" : 33, "birthday" : "1984/12/15" } //한명만 변경됐다.

{ "_id" : ObjectId("582e66183b0c2fcd68503a50"), "username" : "niee" }

> db.users.update({username:"niee"}, {$set:{birthday:"1984/12/15"}},false,true) // 3번째 4번째 파라미터확인

WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 1 })

> db.users.find()

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "username" : "niee", "age" : 33, "birthday" : "1984/12/15" }

{ "_id" : ObjectId("582e66183b0c2fcd68503a50"), "username" : "niee", "birthday" : "1984/12/15" }


- update시에 필요한 파라메터가 4개로 늘어났는데 3번째 파라미터는 나중에 설명


4. 데이터 및 컬렉션 삭제


4-1. 데이터 삭제

- 데이터 삭제는 remove()를 사용한다.

- 데이터 삭제역시 쿼리 셀렉터 사용이 가능하다.

- 쿼리 셀렉터가 없이 remove()를 하면 모든 데이터가 삭제 된다.

ex) age가 33인 데이터 삭제

> db.users.find()

{ "_id" : ObjectId("582d97626352953de1eb29d0"), "username" : "niee", "age" : 33, "birthday" : "1984/12/15" }

{ "_id" : ObjectId("582e66183b0c2fcd68503a50"), "username" : "niee", "birthday" : "1984/12/15" }

> db.users.remove({age:33})

WriteResult({ "nRemoved" : 1 })

> db.users.find()

{ "_id" : ObjectId("582e66183b0c2fcd68503a50"), "username" : "niee", "birthday" : "1984/12/15" }


4-2. 컬렉션 삭제

- 컬렉션의 삭제는 drop()을 사용한다.

- 컬렉션을 삭제하면 컬렉션에 포함 되어있던 인덱스도 모두 삭제 된다.

ex) users 컬렉션의 삭제

> db.users.drop()

true


맛보기 분량이 너무 많은것 같아 포스팅을 한번더 나눠야 겠다 ㅠ 

3부에서 계속.............