TigerCow.Door

안녕하세요. 문범우입니다.

이번 포스트에서는 몽고db에서 사용되는 update() 메소드와 제한자에 대해서 알아보도록 하겠습니다.



먼저 오늘 알아볼 내용에 앞서, 필요한 mock-up 데이터는 아래와 같습니다.



위의 데이터를 만드는 쿼리문은 아래와 같습니다.


gameUser 쿼리문


gameItem 쿼리문



1. 업데이트(Update)


특정 다큐먼트(document)를 수정하는 업데이트에 대해서 알아보도록 하겠습니다.

userItem에 있는 어둠의 단도라는 항목의 price를 수정해보도록 할게요.

현재 어둠의 단도의 가격은 980,000,000입니다. 해당 가격을 1,000,000,000 으로 바꿔볼게요!


mongoDB의 공식문서를 살펴보면 update메소드는 다음과 같은 구조를 가지고 있습니다.


db.COLLECTION.update(

<query>,<update>,

{

upsert: <boolean>,

multi: <boolean>,

writeConcern: <document>,

collation: <document>

}

)


구조에 있는 각각의 인자에 대한 설명은 아래와 같습니다.


Parameter

Type

Description

query

document

업데이트를 할 항목을 선택합니다. find() 함수에서 사용되는 것과 동일합니다.

update

document

선택된 document에 적용할 수정사항을 입력합니다.

upsert

boolean

Optional. (기본값: false) 만약 해당 값을 true로 설정하면, query한 document가 없을 경우 새로운 document를 추가합니다.

multi

boolean

Optional. (기본값: false) 만약 해당 값을 true로 설정하면, query에 해당하는 다수의 document를 수정합니다.

writeConcern

document

Optional. document의 write concern을 표현합니다. 기본으로 사용할 때는 생략합니다. 자세한 설명을 위해서는 메뉴얼을 참고하세요.

collation

document

Optional. Collation을 통해 사용자는 대문자 및 악센트 부호와 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. collation은 기본적으로 다음과 같은 사항을 가지고 있습니다.

collation: {
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}


위의 공식문서를 확인하여 어둠의 단도라는 item의 가격을 수정합니다.


쿼리문은 다음과 같습니다.


db.gameItem.update({name:"어둠의 단도"},{$set:{price:1000000000}});


<query>는 {name:"어둠의 단도"}로 하였습니다.

{_id:"i777"}로 해도 동일합니다.

<update>는 {$set:{price:1000000000}}으로 함으로써 price를 수정하도록 하였습니다.

$set은 제한자라고 불리는 것인데 제한자에 대한 자세한 것은 아래에서 더 살펴보도록 할게요.

아래 사진과 같이 올바른 결과를 나타냅니다.




2. 배열 데이터 추가, 삭제하기


mock-up data를 살펴보면 gameUser의 item 항목에는 배열로써 각 아이템의 _id값을 가지고 있습니다.

그렇다면 특정 유저가 아이템을 얻게되면 어떻게 표현할까요?

그리고 아이템을 잃게되면 어떻게 표현할까요?

위를 표현하기위해 배열항목에 데이터를 추가하거나 삭제하는 방법을 알아보도록 하겠습니다.


2-1. 추가하기


먼저 배열에 데이터를 추가해보도록 하겠습니다. 이 또한, 위에서 사용된 update() 함수를 사용합니다.

초보자라는 user에게 "초보자의 분노" 아이템을 추가해볼게요.

위의 document 수정에서는 $set이라는 제한자가 사용되었는데, 이번에는 $push라는 제한자를 사용합니다.

쿼리를 확인하면 다음과 같습니다.


db.gameUser.update({name:"초보자"},{$push:{item:"i004"}});


아래와 같이 올바른 결과를 나타냅니다.




2-2. 삭제하기


삭제또한, update() 함수를 사용하지만 제한자가 바뀌게 됩니다.

추가를 할땐 $push를 사용하였는데, 삭제에서는 $pull 제한자가 사용됩니다.

이번에는 장사꾼 user가 초보자의 갑옷을 버린 상황입니다.

즉, 장사꾼 user가 가진 item중 초보자의 갑옷을 삭제하도록 하겠습니다.

쿼리문은 다음과 같습니다.


db.gameUser.update({name:"장사꾼"},{$pull:{item:"i002"}});


이 또한 아래와 같이 올바른 결과를 나타냅니다.




3. 제한자


지금까지 document를 수정하고, document의 배열 항목에 데이터를 추가, 삭제하는 것을 알아보았습니다.

그런데 중간중간 '제한자'라는 개념이 등장했죠. 조금 더 구체적으로 말하면 이는 '갱신 제한자'입니다.

이번에는 갱신 제한자에 대해서 더 구체적으로 알아보도록 하겠습니다.


MongoDB에서 갱신 제한자라는 것은, 문서의 부분 갱신을 할때 매우 효율적으로 수행할 수 있도록 하는 개념입니다. document를 변경하거나 추가 또는 삭제하고, 배열과 같은 항목에 대한 연산을 하는데 사용될 수 있습니다.


그렇다면 갱신 제한자의 종류와 그 사용법에 대해서 알아보도록 하겠습니다.


갱신 제한자

설명

$set

document에서 특정 키의 값을 수정합니다. 특정 키가 존재하지 않다면 새롭게 생성합니다.

특정 키의 데이터형도 수정할 수 있습니다.

$unset

document에서 특정 키와 값을 모두 제거합니다.

$nc

배열에 사용되는 제한자로써, 지정된 키가 존재하는지 확인할 수 있습니다.

$inc

이미 존재하는 키의 값을 수정하거나, 새로운 키를 생성합니다. $set과 비슷하지만 주로 값이 자주 변경되는 값을 수정하는데 사용됩니다.

int, long, double 의 자료형에만 사용이 가능합니다.

$push

배열에 사용되는 제한자로써, 지정된 키가 존재할 때 해당 키(배열)의 끝에 요소를 추가하며 지정된 키가 존재 하지 않으면 새로운 배열을 추가합니다.

$pull

배열에 사용되는 제한자로써, 지정된 키에 대한 요소를 삭제합니다.

$addToSet

배열에 사용되는 제한자로써, 중복을 피해서 요소를 배열에 추가할 때 사용합니다. 즉, $nc와 $push를 함께 수행하는 기능과 같습니다.

$each

$addToSet과 함께 사용되는 제한자로써, 여러 개의 값을 중복되지 않게 배열에 추가합니다.

$pop

배열을 스택이나 큐처럼 활용할 수 있습니다.




블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요.

오늘은 mongoDB에서 데이터 자료형과 find함수, 쿼리연산자에 대해서 알아보도록 하겠습니다.

내용에 대한 피드백이나 궁금한 점은 언제든지 댓글을 남겨주세요 :)


1. 데이터 자료형(Datatypes)


MongoDB에는 많은 데이터 자료형을 지원합니다. 그 중 몇가지에 대해서만 알아보도록 하겠습니다.


String

 String은 데이터를 저장할때 가장 많이 사용되는 데이터 자료형 중 하나입니다. MongoDB에서 String은 반드시 UTF-8 형식만 가능합니다.

Integer

 숫자값을 저장할때 주로 사용되는 자료형입니다. Integer는 서버에 따라서 32bit 또는 64bit입니다.

Boolean

 이것은 참(true) 또는 거짓(false)를 나타내는 값을 저장하는 자료형입니다.

Double

 Double 자료형은 부동 소수점 값을 저장하는데 사용됩니다.

Min/Max keys

 이것은 BSON요소의 최저 값과 최고값을 비교하는데 사용됩니다.

Arrays

 Arrays 자료형은 배열 또는 여러 값을 하나의 키에 저장하는데 사용됩니다.

Timestamp

 해당 자료형은 문서가 수정되거나 추가될때 기록하기 편리합니다.

Object

 해당 자료형은 embedded documents에 사용됩니다.

Null

 Null 자료형은 Null 값을 저장할 떄 사용됩니다.

Symbol

 해당 자료형은 문자열(String)과 동일하게 사용됩니다. 하지만 일반적으로 특정 기호 유형을 사용하는 언어로 사용되고 있습니다.

Date

 Date 자료형은 현재의 날짜 또는 시간을 UNIX시간 형식으로 저장하는 데 사용됩니다. Date 객체를 만들어 내며 일, 월, 년을 전달하여 자신의 날짜 및 시간을 지정할 수 있습니다.

Object ID

 이것은 document의 ID를 저장하는데 사용됩니다.

Binary data

 이것은 2진수 데이터를 저장하는데 사용됩니다.

Code

 이것은 document 내부에 JavaScript 코드를 저장하는데 사용됩니다.

Regular expression

 이것은 정규 표현식을 저장하는데 사용됩니다.



2. Document 검색:: find() 함수


이번에는 Document를 검색하는 find() 함수에 대해서 알아보도록 하겠습니다.

먼저 find method에 대한 정의는 아래와 같습니다.


db.COLLLECTION-NAME.find(query,projection)


Parameter

Type

Description

query

document

Optional(선택적임).

검색시 보다 구체적인 내용을 반환받기 위해 조건을 입력. default로는 모든 값을 검색.

projection

document

Optional(선택적임).

검색후 반환 값(출력 값)을 어떤식으로 할지 결정함. default로는 모든 값을 출력. 


find는 위와 같은 구조를 가진 함수입니다. 그럼 바로 사용해볼까요?



위의 사진에서 순서대로 확인해보겠습니다.

먼저 사용할 데이터베이스를 선택하고, 어떠한 collection들이있는지 확인해보았습니다.

그리고 존재하는 firstCollection을 find()함수로 확인해보았습니다.

하나의 document가 존재하여 2개의 document를 추가하였습니다.

이후 find() 함수를 한번더 사용하였습니다.


이때, document가 한줄로 출력되서 보기 힘드신가요?

이러한 시각적 불편함을 해결하기위해 pretty() 함수가 있습니다.

함수이름대로, 보기좋게 document를 출력해주는 함수입니다.

아래 사진을 보시면 잘 이해가 가실거에요.



pretty() 함수를 사용하지 않았을떄와 사용했을떄의 차이가 보이시나요?



2-1. find() 함수 활용하기


find() 함수를 좀 더 응용해보도록 할게요.

기본적으로, collection에 있는 모든 다큐먼트를 조회하려면 어떻게 해야 할까요?

네. 맞습니다. 위에서 했던 것처럼,

db.COLLECTION-NAME.find()

를 입력하면 해당 컬렉션의 모든 document가 조회됩니다.


이제 몇가지 조건을 추가해볼게요.

위의 firstCollection을 바탕으로 하여, 성별(sex)가 남자(male)인 다큐먼트만 조회하려면 어떻게 해야할까요?

find() 함수의 정의에서 살펴본 것처럼, query parameter에 조건을 추가하면 되겠죠?


db.firstCollection.find({"sex":"male"})



한번 더 해보겠습니다.

그럼, 전공이 운동(sport)인 다큐먼트의 이름(name)을 조회하려면 어떻게 해야할까요?

네, 바로 query와 projection 두개다 적절히 조건을 추가하면 되겠습니다.


db.firstCollection.find({"major":"sport"},{"_id":false,"name":true})




3. 쿼리 연산자(Query operators)


이번에는 MongoDB에서 사용되는 쿼리 연산자(Query operators)에 대해서 살펴보겠습니다.

쿼리연산자는 위에서 알아본 find() 함수와 함께 응용되어 다양한 기능을 할 수 있습니다.

쿼리 연산자는 프로그래밍 언어에서 사용되는 비교(Comparison), 논리(Logical)등과 같은 다양한 종류의 연산자가 있습니다.

하나씩 살펴보기에 앞서, 연산자들에 대한 예제를 진행하기 위해서 기본 muck up data를 설정하겠습니다.


insert 코드는 아래와 같으며 그에 대한 muck up data를 find()함수로 확인하였습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
db.operatorTest.insert([
{
    "name":"John""sex":"male""major":"ECE""score":76"grade":"B"
},{
    "name":"Kai""sex":"male""major":"art""score":99"grade":"A"
},{
    "name":"Jane""sex":"female""major":"ECE""score":90"grade":"A"
},{
    "name":"Ko""sex":"male""major":"ECE""score":21"grade":"F"
},{
    "name":"Ki""sex":"female""major":"dance""score":79"grade":"B"
},{
    "name":"Bro""sex":"female""major":"art""score":68"grade":"C"
},{
    "name":"Victor""sex":"male""major":"ECE""score":49"grade":"D"
},{
    "name":"Kan""sex":"female""major":"art""score":61"grade":"C"
}
])
cs





3-1. 비교(Comparison)


연산자

설명(Description)

$eq

Matches values that equal to a specified value.

주어진 값과 동일한 값

$gt

Matches values that are greater than a specified value.

주어진 값보다 더 큰 값

$gte

Matches values that are greater than or equal to a specified value.

주어진 값보다 크거나 같은 값

$lt

Matches values that are than a specified value.

주어진 값보다 더 작은 값

$lte

Matches values that are less than or equal to a specified value.

주어진 값보다 작거나 같은 값

$ne

Matches all values that are not equal to a specified value.

주어진 값과 동일하지 않은 값

$in

Matches any of the values specified in an array.

주어진 배열에 속하는 어떤 값

$nin

Matches none of the values specified in an array.

주어진 배열에 속하지 않는 어떤 값


예제)

A) score의 값이 70이하이고, 45초과를 하는 document를 조회하여라.


query & result



B) grade가 [A,B,C,D]에 속하지 않는 document를 조회하여라.


query & result



C) major가 art인 document를 조회하여라.


query & result



3-2. 논리(Logical)


연산자

설명(Description)

$or

Joins query clauses with a logical OR returns all documents that match the conditions of either clause.

논리적 OR과 같은 의미로써, 주어진 조건 중 하나라도 true일때 true를 반환합니다.

$and

Joins query clauses with a logical AND returns all documents that match the conditions of both clauses.

논리적 AND와 같은 의미로써, 주어진 조건 중 모든 조건이 true일때 true를 반환합니다.

$not

Inverts the effect of a query expression and returns documents that do not match the query expression.

주어진 조건에 대해 반대 논리를 반환하는 것으로써, 주어진 조건이 false일때 true를 반환합니다.

$nor

Joins query clauses with a logical NOR returns all documents that fail to match both clauses.

주어진 조건 중 모든 조건이 false일때 true를 반환합니다.


예제)

A) 성별이 남자(male)이고 score가 50이하인 document를 조회하여라.


query & result



B) 전공(major)가 ECE가 아니고 score가 80미만이 아닌 document를 조회하여라.


query & result



C) 전공(major)가 ECE가 아니거나 score가 80미만이 아닌 document를 조회하여라.


query & result



3-3. 요소(Element)


연산자

설명(Description)

$exists

Matches documents that have the specified field.

주어진 필드를 가진 documents를 조회합니다.

$type

Selects documents if a field is of the specified type.

field가 지정된 유형인 경우 해당 documents를 선택합니다.



3-4. 평가(Evaluation)


연산자

설명(Description)

$mod

Performs a modulo operation on the value of a field and selects documents with a specified result.

field 값에 대한 modulo 연산을 수행하고 해당 결과가 있는 documents를 선택합니다.

$regex

Selects documents where values match a specified regular expression.

정규 표현식(regular expression)과 일치하는 documents를 선택합니다.

$text

Performs text search.

텍스트 검색을 수행합니다.

$where

Matches documents that satisfy a JavaScript expression.

JavaScript 표현식에 만족하는 documents를 조회합니다.



3-5. 배열(Array)


연산자

설명(Description)

$all

Matches arrays that contain all elements specified in the query.

query에 지정된 모든 요소를 포함하는 배열을 찾습니다.

$elemMatch

Selects documents if element in the array field matches all the specified $elemMatch conditions.

배열 field의 요소가 지정된 $elemMatch의 조건과 모두 일치하는 documents를 선택합니다.

$size

Selects documents if the array field is a specified size.

배열 field가 지정된 크기인 경우의 documents를 선택합니다.



네, 이렇게 해서 MongoDB에서 데이터 자료형과, find() 함수, 다양한 연산자에 대해서 알아보았습니다.

내용에 대한 피드백이나 궁금한 점은 언제나 댓글을 이용해주세요 :)

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc



안녕하세요. 문범우입니다.

오늘은 mongoDB의 database, collection, document 들에 대해서 알아보겠습니다.

기본적인 개념들은 지난 포스트를 참고해주시고, 오늘부터는 직접적으로 생성하고 제거하는 등의 활동을 해볼게요.



지난 포스트에서 알아본 듯이 mongoDB는 아래와 같은 architecture를 가지고 있습니다.


Database_1

Collection_1

Documents_1

 

“_id” : “~~~~~~~~~~~~”,

“name” : “홍길동”,

“age” : “30”,

. . .

 

Documents_2

. . .

 

Documents_3

. . .

. . .


 

Collection_2

. . .


Database의 내부에 Collection, 그리고 Collection 내부에 Document가 존재합니다.

이번 포스팅에서는 최종적으로 Documents 를 생성하여 우리가 원하는 key와 value를 저장해보도록 하겠습니다.

물론 그러기 위해서는 아래와 같은 과정이 필요합니다.


Database 생성 -> Collection 생성 -> Documents 생성


그리고 각각을 제거해보는 것까지 함께 해보도록 하겠습니다.


Database 생성-> Collection 생성 -> Documents 생성 -> Documents 제거 -> Collection 제거 -> Database 제거




1. Database 생성

먼저 mongoDB의 server를 키고, mongoDB에 들어갑니다.

그리고 show dbs 명령어를 통해 현재 만들어진 database를 확인할 수 있습니다.



위의 사진과 같이 아무것도 뜨지 않는다는 것은 내가 만든 데이터베이스가 없거나

만든 데이터베이스 내부에 한개 이상의 Document가 존재하지 않는다는 것 입니다.

즉, 데이터베이스가 만들어져 있더라도 해당 데이터베이스 내부에 Documents가 하나도 없다면 리스트에 보이지 않습니다.

이때, 자신이 사용중인 데이터베이스를 확인하기 위해서는 db 명령어를 입력합니다.


현재 저는 test라는 database를 사용하고 있네요.

이제 새롭게 database를 생성해보고 해당 database로 진행해보겠습니다.



use newDatabase 명령어를 통해 newDatabase라는 이름을 가진 database를 새롭게 만듭니다.

(이때 만약 해당 이름을 가진 데이터베이스가 존재한다면

새롭게 만들어지지 않고 기존에 있던 데이터베이스를 사용하게 됩니다.)

db 명령어를 통해서 사용중인 database가 바뀌었음을 확인할 수 있습니다.



2. Collection 생성

이번에는 collection을 생성해보겠습니다.

collection을 생성하기 위해서는 db.createCollection(name,[options]) 이라는 명령어를 사용합니다.

이때 name은 string Type으로써, collection의 이름을 말하며 options는 document Type으로써 선택적인 매개변수입니다.

공식문서를 통해 확인해보시고 필요한 항목을 사용하시면 됩니다. collection 이름은 firstCollection 으로 만들어보겠습니다.



지금까지 만들어진 collection을 확인하기 위해서는 show collections 명령어를 통해서 가능합니다.




3. Document 추가

Document 는 함수 자체에서 insert로 명시되어 있기에 '생성'이라는 말 대신 '추가'라는 말을 사용하였습니다.

새로운 Document를 추가하기 위해선 어떤 collection에 추가할지도 함께 고려해야합니다.

즉, 명령어에는 collection의 이름과 추가될 document의 내용이 들어갑니다.

db.COLLECTION.insert([{document1},{document2}, ... ]) 가 COLLECTION 이라는 이름을 가진 collection에 새로운 document를 추가하는 명령어 입니다.

해당 명령어를 통해 이름, 성별, 전공을 가진 document를 2개 추가해 보도록 하겠습니다.



그리고 db.COLLECTION.find() 을 통해 현재까지 추가된 document를 확인합니다.





4. document 제거

document를 제거하기 위해서는 db.COLLECTION.remove(<query>,<justOne>) 함수를 사용합니다.

db.COLLECTION.remove(<query>,<justOne>)에 대한 공식문서의 설명은 아래와 같습니다.



즉, query는 삭제할 document의 기준, 조건을 말합니다. 만약 query를 비워둔다면 모든 documents 가 해당되니 유의하세요.

justOne 은 한개만 지울 것인지에 대한 변수입니다.

default로 false값을 가지며, 딱 하나의 document만 지울때는 true로 설정하면 됩니다.


저는 3번에서 입력한 document 중 pika라는 이름을 가진 document 하나만 제거해보도록 하겠습니다.



document 하나가 올바르게 지워진 것을 알 수 있습니다.



5. Collection 삭제

현재 사용하고 있는 database의 collection을 보려면, show collections 라는 명령어를 사용하면 된다고 말하였습니다.

한번 더 확인해보겠습니다.


firstCollection 이라는 collection 하나만 존재하므로 하나를 더 생성합니다.



다시 secondCollection을 지워보도록 하겠습니다.

collection을 지우는 명령어는 db.COLLECTION.drop() 입니다.




6. Database 제거

현재 제가 만들어놓은 database의 항목을 확인해보기 위해 show dbs 명령어를 입력합니다.

제거할 database를 임시로 만들기 위하여 temp 라는 database를 만듭니다.



하지만 use temp 명령어를 입력하여도 temp라는 database는 하나이상의 document를 가지고 있지 않기 때문에

show dbs 에서 리스트에 보이지 않습니다. 따라서 빠르게 document를 추가해줍니다.

이때 따로 collection을 미리 생성하지 않아도 아래 명령어가 가능합니다.

db.tempCollection.insert({"name":"jone"})




이제 사용하지 않는 temp라는 database를 제거하기 위해 해당 database를

use DATABASE_NAME 을 통해 선택하고, db.dropDatabase() 함수를 사용하여 제거합니다.




이렇게


Database 생성-> Collection 생성 -> Documents 생성 -> Documents 제거 -> Collection 제거 -> Database 제거


순서대로 진행하였습니다.


마지막으로 각각에 대한 명령어를 정리해볼게요 !



정리


 

생 성 (추 가)

확 인

제 거 (삭 제)

Database

use DATABASE

show dbs

db.dropDatabase()

Collection

db.createCOLLECTION(name,[options])

show collections

db.COLLECTION.drop()

Document

db.COLLECTION.insert({do1},{do2}, …)

db.COLLECTION.find()

db.COLLECTION.remove(<query>,<justOne>)



오늘은 Database, Collection, Document 를 직접 생성하고 확인하고 제거해보았습니다.

다음엔 입력한 데이터를 이용한 실습을 진행해보겠습니다.

문의사항은 덧글이나 이메일(doorbw@outlook.com)을 이용해주세요 :)

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

안녕하세요. 문범우입니다.

지난 시간에는 간단하게 MongoDB를 설치해보았습니다.

이번에는 앞으로 MongoDB를 다루기 위해 필요한 NoSQL에 대한 기초적인 개념 공부를 진행하고

윈도우에서 보다 쉽게 MongoDB를 사용하기 위해 환경변수 설정을 진행해보도록 할게요!





1. NoSQL

먼저 NoSQL에 대한 개념을 공부해보겠습니다.

NoSQL 데이터베이스는 전통적인 관계형 데이터베이스에 비해 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 매커니즘을 제공합니다.

NoSQL 시스템은 SQL 계열 쿼리 언어를 사용할 수 있다는 사실을 강조한다는 면에서 'Not only SQL'로 불리기도 합니다.

또한 관계형 데이터베이스가 아니므로 고정된 schema 또는 JOIN이 존재하지 않습니다.


2. Document Model

MongoDB 는 Relational Model 이 아닌 Document Model 입니다.

먼저 아래 사진을 확인해볼게요!


사진의 아래, Document Model을 확인하시면 각각의 데이터들이 Collection으로 묶인 것을 볼 수 있습니다.

MongoDB 에서는 각각의 데이터(RDMS에서는 레코드라고 하는 것)들이 Document 로써 존재합니다.

그리고 Document 들의 묶음을 MongoDB에서 Collection이라고 말합니다.

또한 Collection 들의 물리적인 컨테이너는 Database라고 하죠.


아래 사진을 보면 좀 더 이해가 가실 겁니다.



이해가 가시나요?

그럼 Document에 대해서 좀 더 알아보도록 하겠습니다.

위에서 언급했듯이 Document는 RDMS의 record와 비슷한 성격을 지닌 녀석입니다.

위 사진에서 볼 수 있듯이 하나의 Document 는 한개 이상의 key-value pair 로 이루어져 있습니다.

RDMS 에서 속성이라고 하는 것을 key라고 생각하시면 편할 것 같아요.

Document의 예를 확인해볼게요!




위의 사진을 확인하시면, _id, name, city, address, phone 라는 key를 확인하실 수 있으며 그에 대응하는 value를 확인 할 수 있습니다.

즉, 위의 Document는 총 5개의 key-value pair를 가지고 있습니다.

위의 key 중에 _id 는 12bytes 의 hexadecimal 값으로서, 각 document의 유일성을 보장합니다.

_id에 관해, 각 byte 별로 의미하는 것은 다음과 같습니다.

첫 4bytes: 현재 timestamp / 다음 3bytes: machine id / 다음 2bytes: MongoDB 서버의 프로세스 id / 마지막 3bytes: 순차번호


Document는 dynamic schema를 갖고있습니다. 같은 collection 안에 있는 document 끼리 다른 schema를 가질 수 있다는 것인데 쉽게 말해서 서로 다른 key들을 가지고 있을 수 있다라고 생각하시면 됩니다.


3.Data Modeling

간단한 데이터 모델링을 참고해보도록 할게요.

블로그를 생각해 봅시다.

블로그에서는 다수의 게시글이 존재하죠? 그리고 각 게시글은 여러개의 태그를 가질 수 있고, 각 게시글에는 여러개의 댓글을 가질 수 있습니다.

만약 RDMS에서 해당 데이터베이스를 간단히 디자인한다면 아래와 같은 3개의 테이블을 만들 것 입니다.


 Comment

Post

Tag 

*id 

*id 

*id 

Post_id 

title 

Post_id 

username 

content 

tagContent 

content 

username 

 

 time

time 

 


그리고 Comment와 Tag 테이블은 Post 테이블에 속하도록 디자인되겠죠.

하지만 NoSQL 에서는 이 모든 것을 하나의 Document 에 넣습니다. 아래와 같이 디자인 될 것 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
 _id: POST_ID,
 title: POST_TITLE,
 content: POST_CONTENT,
 username: POST_WRITER,
 tags: [ TAG1, TAG2, TAG3 ],
 time: POST_TIME
 comments: [
 { 
 username: COMMENT_WRITER,
 mesage: COMMENT_MESSAGE,
 time: COMMENT_TIME
 },
 { 
 username: COMMENT_WRITER,
 mesage: COMMENT_MESSAGE,
 time: COMMENT_TIME
 }
 ]
}
cs


RDMS 와 NoSQL의 차이에 대해서 대략적으로 이해가 가셨나요?

추가적인 사항은 댓글을 남겨주시거나 doorBW@outlook.com 으로 메일 주세요 :)


4. MongoDB 환경변수 설정(Windows)

마지막으로 MongoDB를 좀 더 편리하게 사용하기 위해 환경변수 설정을 하도록 하겠습니다.

환경변수 설정을 통해 매번 MongoDB의 설치 경로로 이동하실 필요가 없으실 거에요.

아래 사진의 순서대로 진행하시면 됩니다.


1. 제어판 -> 시스템 및 보안 -> 시스템 -> 시스템 보호



2. 시스템 속성 창에서 환경변수 클릭



3. 변수이름 Path 를 누르고 편집 클릭




4. 새로만들기 -> MangoDB 설치경로 입력 -> 확인 클릭




이렇게 설정하시면 됩니다!

이제 확인해볼까요?




네, 정상적으로 됩니다 :)


추가적으로 데이터베이스 디텍토리를 변경하고 싶으시다면 아래 명령어를 입력하시면 됩니다.


C:\Program Files\MongoDB\Server\3.2\bin> mongod --dbpath "원하는 디텍토리"


이상으로 MongoDB 환경변수 설정을 마무리하겠습니다.


오늘 NoSQL개념 3가지와 MongoDB 환경변수 설정을 진행하였습니다.

다음 포스팅에서는 본격적으로 database를 만들고 삭제하는 등의 진행을 해볼게요 :)

문의사항은 덧글 및 이메일(doorbw@outlook.com)을 이용해주세요.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

안녕하세요. 문범우입니다.

오늘은 MongoDB를 Windows OS에 설치해보도록 하겠습니다.

MongoDB는 NoSQL 데이터베이스로 분류됩니다.

MongoDB는 SQL보다 더 간결하지만 SQL과 유사한 쿼리를 사용하는 이점 때문에 사용 유저가 많은 편입니다.

아무 조건 없이 저장해도 동작이 되고 프로그래밍 언어에서 쓰던 데이터의 형태 그대로 저장이 가능하다고 합니다.

또한 테이블 스키마가 없어서 테이블 수정 인덱스 추가 변경이 백그라운드에서 처리 가능한 것이 장점이라 볼 수 있습니다.


단점으로는, memory가 가득 차서 HDD로 내려가 데이터를 처리하면 속도가 급감하며

데이터 삭제나 업데이트를 했을 때 단편화 문제를 발생시켜 데이터 처리에 필요 이상의 memory를 사용할 수 있다고 하네요.


뭐 이론적인 내용은 그렇습니다!

그럼 바로 설치를 시작해보도록 할게요!




1. MongoDB 설치하기


먼저 아래 링크를 통해 MongoDB 설치파일을 다운 받도록 합니다.

https://www.mongodb.com/download-center?jmp=homepage#community



자신에게 맞는 OS를 선택해서 다운로드를 진행합니다!

저는 현재 Windows 10이기 때문에 위의 사진에서 다운로드를 진행하였습니다.


다운받은 파일을 실행시켜 MongoDB 설치를 진행합니다.

설치하면서 그냥 next만 눌러주시면 되고 중간쯤에서 Setup Type에서 저는 Complete를 선택하였습니다.



이렇게 설치가 완료되었습니다!


2. MongoDB 테스트(Test)

2-1. MongoDB server 실행하기 (mongod.exe)


설치한 MongoDB를 테스트해보기 위해 아래와 주소의 폴더로 들어 갑니다.


C:\Program Files\MongoDB\Server\3.4\bin



그럼 위의 사진에서 확인할 수 있듯이, mongo.exe 파일과 mongod.exe 파일이 존재하는 것을 확인할 수 있습니다.


mongod.exe 파일은 MongoDB server의 실행 파일입니다.

mongo.exe 파일은 MongoDB 자체를 조작할 수 있는 MongoDB Shell 프로그램 입니다.


따라서,

먼저 MongoDB Shell을 시작하기에 앞서 MongoDB server를 실행시켜 줘야합니다.

따라서 아래와 같이 현재 폴더에서 명령프롬프트(cmd)창을 켜주시거나

명령프롬프트(cmd) 창을 켜서 현재 폴더의 위치로 들어옵니다.



MongoDB 의 server를 실행시켜주기 전에!

한가지 진행해야 할 일이 남았습니다.

MongoDB는 기본적으로 참조하는 db 폴더가 있는데 그것을 생성해줘야 합니다.

cmd 창에 아래와 같은 명령어를 입력해줌으로써 MongoDB가 기본적으로 참조하는 C:\data\db 경로를 만들어 줍니다.


mkdir C:\data\db



그리고 cmd창에 아래와 같은 명령어를 입력함으로써 MongoDB server를 실행시킵니다.


mongod.exe



(Windows 방화벽 관련 창이 뜨면 허용을 눌러주도록 합니다!)



이렇게 해서 MongoDB server를 정상적으로 실행시켰습니다.


2-2. MongoDB Shell 실행하기 (mongo.exe)


MongoDB server가 실행되고 있도록 하고, cmd 창을 하나 더 열어서 2-1. 에서 들어 갔던 경로로 다시 들어가도록

아래 명령어를 입력합니다.


cd C:\Program Files\MongoDB\Server\3.4\bin



그리고 mongo.exe 를 입력하여 MongoDB Shell을 실행합니다.



위의 그림과 같이 '>' 표시가 떠야합니다.

제대로 설치되었는지 확인하기 위해서는 show dbs를 입력합니다.



위와 같이 뜬다면 정상적으로 설치 된 것 입니다.



이렇게해서 MongoDB 설치를 성공적으로 진행하였습니다 :)

다음번 부터는 MongoDB 를 이용해서 뭐든해봅시다.

기본적인 명령어부터 알아가며 공부해볼게요~

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc