본문 바로가기

MongoDB/Setup & CRUD

MongoDB 설치 및 CRUD

MongoDB 설치 후 테스트 그리고 WebStorm 과 연동하여 CRUD 작업하는 예


개요

MongoDB는 No-SQL 데이터베이스 중에서 많이 사용되는 오픈소스 소프트웨어이다

No-SQL 데이터베이스는 기존의 SQL문장을 사용하지 않는 데이터베이스를 말한다

MongoDB는 특히 데이터량이 많을 경우에 그 성능이 돋보이고 또한 데이터를 기록하는 작업에 높은 성능을 보이는 것으로 알려졌다

Collection은 기존 DB의 테이블에 해당하고, Document는 기존 테이블의 레코드(행)에 해당한다

Field는 기존 DB의 컬럼에 해당하는 용어로 사용된다

Document는 JSON 포맷으로 저장되거나 표현되고, 모든 질의어에도 JSON 문자열을 사용한다

MongoDB는 JSON기반의 데이터베이스라고 할 수 있다



다운로드 및 설치

http://mongodb.org

R2+ : Win 7 이상에는 R2+ 버전 설치

환경변수 PATH 에 mongod.exe, mongo.exe 가 포함된 디렉토리를 등록


데이터베이스 시스템 -> C:\Program Files\MongoDB\Server\3.0\bin\mongod.exe

mongodb shell ->       C:\Program Files\MongoDB\Server\3.0\bin\mongo.exe



커맨드 프롬프트에서 mongod.exe 실행

C:\Users\duniv6-000>mongod

2015-12-07T09:52:59.150+0900 I CONTROL  Hotfix KB2731284 or later update is not

installed, will zero-out data files

2015-12-07T09:52:59.226+0900 I STORAGE  [initandlisten] exception in initAndList

en: 29 Data directory C:\data\db\ not found., terminating

2015-12-07T09:52:59.227+0900 I CONTROL  [initandlisten] dbexit:  rc: 100



위와 같이 C:\data\db 디렉토리가 없다는 오류메시지가 나오면 해당 디렉토리를 먼저 생성한 후에 mongod.exe를 다시 실행한다

C:\Users\duniv6-000>mongod

2015-12-07T09:57:03.947+0900 I CONTROL  Hotfix KB2731284 or later update is not

installed, will zero-out data files

2015-12-07T09:57:04.031+0900 I JOURNAL  [initandlisten] journal dir=C:\data\db\j

ournal

2015-12-07T09:57:04.032+0900 I JOURNAL  [initandlisten] recover : no journal fil

es present, no recovery needed

2015-12-07T09:57:04.046+0900 I JOURNAL  [durability] Durability thread started

2015-12-07T09:57:04.047+0900 I JOURNAL  [journal writer] Journal writer thread s

tarted

2015-12-07T09:57:04.126+0900 I CONTROL  [initandlisten] MongoDB starting : pid=5

944 port=27017 dbpath=C:\data\db\ 64-bit host=duniv6-000-PC

2015-12-07T09:57:04.126+0900 I CONTROL  [initandlisten] targetMinOS: Windows 7/W

indows Server 2008 R2

2015-12-07T09:57:04.127+0900 I CONTROL  [initandlisten] db version v3.0.7

2015-12-07T09:57:04.127+0900 I CONTROL  [initandlisten] git version: 6ce7cbe8c6b

899552dadd907604559806aa2e9bd

2015-12-07T09:57:04.128+0900 I CONTROL  [initandlisten] build info: windows sys.

getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Servic

e Pack 1') BOOST_LIB_VERSION=1_49

2015-12-07T09:57:04.128+0900 I CONTROL  [initandlisten] allocator: tcmalloc

2015-12-07T09:57:04.129+0900 I CONTROL  [initandlisten] options: {}

2015-12-07T09:57:04.131+0900 I INDEX    [initandlisten] allocating new ns file C

:\data\db\local.ns, filling with zeroes...

2015-12-07T09:57:04.320+0900 I STORAGE  [FileAllocator] allocating new datafile

C:\data\db\local.0, filling with zeroes...

2015-12-07T09:57:04.321+0900 I STORAGE  [FileAllocator] creating directory C:\da

ta\db\_tmp

2015-12-07T09:57:04.431+0900 I STORAGE  [FileAllocator] done allocating datafile

 C:\data\db\local.0, size: 64MB,  took 0.108 secs

2015-12-07T09:57:04.437+0900 I NETWORK  [initandlisten] waiting for connections

on port 27017



몽고디비를 중지하려면 Ctrl + C를 누른다


MongoDB Shell

몽고디비 쉘을 실행하여 몽고디비에 접속하려면 또 다른 커맨드 프롬프트를 열고 mongo.exe를 실행한다

Microsoft Windows [Version 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.


C:\Users\duniv6-000>mongo

2015-12-07T10:01:20.099+0900 I CONTROL  Hotfix KB2731284 or later update is not

installed, will zero-out data files

MongoDB shell version: 3.0.7

connecting to: test

Welcome to the MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

        http://docs.mongodb.org/

Questions? Try the support group

        http://groups.google.com/group/mongodb-user

>



쉘 클라이언트가 서버에 접속되면 서버 콘솔에는 다음과 같이 클라이언트 접속이 확인된다

2015-12-07T10:01:20.211+0900 I NETWORK  [initandlisten] connection accepted from

 127.0.0.1:2091 #1 (1 connection now open)



몽고쉘 명령 테스트

몽고쉘 화면의 커맨드 프롬트프에 다음과 같이 쉘명령을 입력하면 제대로 실행되는 것을 확인할 수 있다

Microsoft Windows [Version 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.


C:\Users\duniv6-000>mongo

2015-12-07T10:01:20.099+0900 I CONTROL  Hotfix KB2731284 or later update is not

installed, will zero-out data files

MongoDB shell version: 3.0.7

connecting to: test

Welcome to the MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

        http://docs.mongodb.org/

Questions? Try the support group

        http://groups.google.com/group/mongodb-user

> db

test

>



MonogDB의 IDE로 WebStorm 사용하기


WebStorm 다운로드 및 설치

WebStorm(Javascript , 클라이언트 코딩을 위한 IDE) 설치

https://www.jetbrains.com/webstorm/download/



WebStorm에 Mongo 플러그인 설치

WebStorm 실행 > File > Settings... > Plugin

상단 입력창에 mongo 를 입력하면 자동으로 검색이 되어 검색 리스트에 Mongo Plugin 이 나타난다.

검색이 안되는 경우에는 결과 메시지 안에서 "browse" 링크를 누르고 새로운 검색창에서 mongo를 입력하면된다

검색된 Mongo Plugin 의 "Install" 버튼을 눌러 설치하면 "Install" 버튼이 "Restart WebStorm"으로 변경되므로 이 버튼을 눌러 웹스톰을 다시 시작한다



WebStorm의 Mongo Explorer 설정

WebStorm > View > Tool Windows > Mongo Explorer 선택

여기서는 몽고디비 쉘과 데몬을 웹스톰에 등록한다


Mongo Explorer 패널에는 아직 몽고서버가 설정되지 않았으므로 렌치 모양의 아이콘을 눌러서 설정을 유도한다

Settings 화면의 왼쪽 아래에 있는 "Other Settings" > "Mongo Servers" 선택


몽고 쉘 경로 등록

중앙 상단의 "Path to Mongo executable:" 입력난에 MongoDB Shell 의 경로를 입력한다("..." 버튼 사용)

입력난 우측의 "Test" 버튼을 눌러서 버튼 우측에 "초록색 체크 아이콘"이 나타나면 정상적으로 연결된 것이다


몽고 데몬 정보 등록

Settings 화면의 중앙에는 "No server configuration set" 이라는 메시지가 보이고 우측 위의 초록색 "+" 아이콘(add Server)을 눌러 "Add a Mongo Server" 창을 띄운다


"Add a Mongo Server"창에서 Label 항목에 임의의 이름을 입력하고 하단의 "OK" 버튼을 눌러 넘어간다

다음 화면에서 "Apply", "OK" 버튼을 눌러 서버설정을 마친다


Mongo Explorer에서 몽고 서버에 연결

Mongo Explorer 패널에 추가된 몽고서버를 확인하고  그 위에서 마우스 우측을 눌러 "connect to this server" 를 선택한다. 이 때 커맨드 프롬트프에서 mongod.exe를 실행한 후에 해야 한다

Mongo Explorer에서 몽고서버에 연결되면 데이터베이스 아이콘이 추가되어 나타난다


Mongo Explorer에서 몽고 쉘 실행

Mongo Explorer에서 몽고서버에 연결되면 데이터베이스 아이콘을 선택한다

Mongo Explorer의 상단에서 "Mongo Shell" 아이콘을 누르면 화면 하단에 몽고쉘이 화면이 나타난다

몽고쉘 프롬프트에서 "db"를 입력하고 왼쪽의 "초록색 삼각형" 아이콘을 누르면 쉘 명령이 실행되어 "local"이라고 나타난다.

실행의 단축키는 Ctrl + Enter 이다

WebStorm 이 제공하는 몽고쉘에서는 복사/붙여넣기/지우기 등의 명령이 자유롭기 때문에 윈도우에서 제공하는 커맨드 프롬프트보다 편리하다


Collection (Table와 유사), Document (Row, Record와 유사), Field ( Column과 유사 )


데이터베이스 만들기/삭제

>use mydb

>db.dropDatabase()

WebStorm의 몽고쉘 화면 지우기 : 마우스 우측 > Clear All


> db

local

> use game


switched to db game

> db

game

> db.dropDatabase()

{ "ok" : 1 }

> use game

switched to db game



컬렉션 만들고 데이터(Document) 넣기


Document는 JSON포맷의 문자열이어야 한다

http://www.json-generator.com에 접속하면 테스트용 JSON 포맷의 문자열을 생성할 때 도움을 받을 수 있다

왼쪽에서 필드명을 변경하고 상단 중앙의 "Generate" 버튼을 누르면 우측에 JSON문자열이 생성된다

우측에 생성된 JSON문자열을 복사해서 아래의 insert() 괄호안에 붙여넣고 실행하면 Document가 컬렉션안에 삽입된다

db.test.insert( JSON 문자열 ) : 현재 사용하는 DB에 test라는 컬렉션을 생성하고 그 안에 Document를 삽입한다. 괄호 안에 JSON 문자열(Document)을 넣고 실행한다


여러개의 Document를 한꺼번에 삽입할 때는 db.test.insert( [ {},{},{} ] ) 형식으로 JSON 배열을 사용하면 된다


데이터 출력하기

>show collections 명령으로 현재 존재하는 컬렉션 이름을 출력한다

>db.test.find() : 컬렉션 안의 모든 Document를 출력한다

>db.test.find().pretty() : 사람이 판독하기 쉽게 Document를 출력한다

>db.test.findOne() : 가장 먼저 입력된 Document 한개만 출력한다



Object ID, Remove, Update, Drop, Find 등


_id(primary key) 필드가 없는 Document에는 자동으로 생성되어 삽입된다

>db.test.remove( {"_id" : "56652a567b583d986e4dbb13" } )

>db.test.update( {"_id" : "56652a567b583d986e4dbb13"}, {"firstName":"John", "lastName":"One" } )  // 모든 필드 갱신

> db.member.update( { "name" : "Dennis Holland" }, { $set : { "age":30 } } )  // Document 내의 특정 필드만 갱신


컬렉션 삭제

>db.test.drop()  // 컬렉션 삭제

>db.test.insert( { "key":"value" } )  // 컬렉션 생성


컬렉션에서 Document 검색

>db.test.find() : 컬렉션내의 모든 Document 출력

>db.test.find( {"gender": "male" } ) : 특정 Document 만 검색

>db.test.findOne( { "age" : 30 } ) : 검색된 첫번째 Document 출력

>db.member.find( { "name":"Dennis Holland" }, {"age":1, "_id":0 } ) : _id 를 출력하지 않고 age 필드만 출력

>db.test.find().pretty() : 


AND 조건 표현

>db.test.find( {"eyeColor":"blue", "gender":"female"}) : 검색조건이 2개 이상인 경우

>db.test.find( {"eyeColor":"blue", "gender":"female"}).pretty() :  검색결과가 가독성있게 출력


OR 조건 표현 ( mongodb 의 키워드는 $xxx 처럼 '$' 기호로 시작된다 )

>db.test.find( { $or : [ {"eyeColor": "blue"}, {"gender" : "female"} ] } ).pretty()


비교 조건 표현

db.test.find( { "age": {$gte : 22} } ).pretty() : lt, gt, ne, gte, lte 등 사용


_id를 제외하고 이름 필드만 출력

>db.test.find( {"gender":"female" },{"name":1} ) : name필드와 _id 필드가 출력된다

>db.test.find( {"gender":"female" },{"name":1, "_id":0} )


3개의 Document만 출력

>db.test.find().limit(3)


건너뛰고 출력

>db.test.find().skip(2) // 2개의 Document는 건너뛰고 3번째 Document부터 출력한다

>db.test.find().skip(2).limit(5).pretty()


>db.dropDatabase() // 데이터베이스 삭제

>use mydb  // mydb 데이터베이스 생성

>db.test.insert( [{"key":"value"},{"key":"value"},{"key":"value"}] ) // mydb 데이터베이스에 test Collection을 만들고 3개의 Document 삽입


인덱싱 (검색성능을 올리기 위한 설정)

>db.test.find( { "age" : {$lt:22} })

>db.test.find( { "age" : {$lt:22} }).explain("executionStats") : 처리상태 출력

위의 명령실행 결과 "totalDocsExamined" 필드 값이 전체 Document의 수로 설정되어 검색성능이 떨어진다


>db.test.getIndexes() : _id 필드만 인덱스가 설정된 것을 확인할 수 있다


>db.test.ensureIndex( {"age":1 } ) : age 필드를 대상으로 인덱스 설정


인덱스 설정 후 처리 상태를 출력해보면....

>db.test.find( {"age" : $lt:22 } }).explain("executionStats") : "totalDocsExamined" 가 줄어든 것을 확인할 수 있다


>db.test.dropIndex( { "age":1 } ) : 인덱스 삭제

>db.test.getIndexes() : 인덱스가 삭제되어 출력결과에서 보이지 않게 된다



Grouping, Sum, Avg, Max 구하기


eyeColor 필드를 기준으로 그룹을 만들고 그룹 내의 Document 수를 출력하는 경우

>db.test.aggregate( {$group : { _id : "$eyeColor", total : { $sum:1} } } )  // 무엇에 대한 합계인지 명시안된 경우


age 를 기준으로 그룹을 만들고 각 그룹 내의 Document 갯수 구하기

>db.test.aggregate( {$group : { _id : "$age", total : { $sum:1} } } ) // 무엇에 대한 합계인지 명시안된 경우


age 필드를 기준으로 그룹을 만들고 각 그룹의 평균나이 구하기

>db.test.aggregate ( { $group: {_id: "$eyeColor", avgAge: { $avg:"$age"}}} ) // 나이에 대한 평균임을 명시함


최고 값 구하기

>db.test.aggregate ( { $group: {_id: "$eyeColor", richest: { $max:"$balance"}}} ) // 잔고에 대한 최고값임을 명시함