일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- flet
- JVM
- kotlin
- Spring boot
- 코틀린
- write by chatGPT
- 자바암호
- NIO
- 파이썬
- 자바
- 웹 크롤링
- Java
- 인프라
- 시스템
- 뉴턴역학
- chatGPT's answer
- lombok
- GIT
- 소프트웨어공학
- 역학
- 유닉스
- 리눅스
- 고전역학
- oracle
- 자바네트워크
- Database
- write by GPT-4
- android
- python
- GPT-4's answer
- Today
- Total
Akashic Records
MongoDB, 설치와 간단 사용법 본문
MongoDB(from “humongous”)는 전통적인 RDBMS의 대안인 NOSQL Family의 일부로 오픈 소스 “Document-Oriented Database”을 지향하고 있습니다.
MongoDB에서 Data는 JSON과 같은 Dynamic Schema 형태의 Document(문자열로 구성된 단위라고 생각하면 됩니다.)구조로 저장 되는데 MongoDB에서는 이를 BSON 이라 합니다.
MongoDB가 다른 문서 데이터베이스와 구별되는 한 가지 기능은 SQL문을 MongoDB 쿼리 함수 호출로 매우 간단하게 변환하는 기능있어 기존 RDBMS를 쉽게 마이그레이션 할 수 있다고 합니다.
MogoDB가 최근에 주목을 받게 된 이유는 Mobile 환경의 확대와 SNS의 활성화로 설명 할 수 있을 것 같습니다.
Mobile환경의 확대
최근 모바일 어플리케이션은 Hybrid 형태을 띄며 Data을 기본적으로 Server Side에 저장하기 때문에 지속적으로 Server Side로 부터 Data을 받아오는게 사용자 사용성에 중요한 척도가 되었다.
모바일 어플리케이션 개발 기술 중 Server/Client 통신 기술은 Open API 형태로 WebService을 사용하며 그 중 RESTFul 방식으로 전문형태는 JSON을 사용하는 것이 거의 표준으로 잡혀 있음.
MogoDB와 같은 Document 기반 DB는 JSON형태로 저장되기 때문에 Data와 어플리케이션간 통합에 최적의 구조를 가진다.
SNS의 활성화
모바일 환경에서 SNS가 활성화 되고 나서 엄청난 규모의 Data가 발생한다.
전통적인 RDBMS로는 현재 규모의 Big Data을 저장하고 관리하기 어렵다.
새로운 형태의 NoSQL 기술이 필요하게 되었고 가장 적합한 형태가 MongoDB이다.
MongoDB의 특징
다양한 데이터 모델
Row라는 개념을 보다 유연한 모델인 Document로 바꾸었다. 내장 문서와 배열을 문서에 사용할수 있기 때문에 문서 지향 모델은 복잡한 계층 관계를 하나의 레코드로 표현할 수 있게 한다. 이 방식은 최신 객체지향 언어를 사용하는 개발자의 관점에 매우 적합함.
순쉬운 확장
문서 지향 데이터 모델은 데이터를 여러 서버에 자동적으로 분산해준다. 문서를 자동으로 재분배 함으로써 클러스터 내 데이터의 양과 부하를 조절할 수 있다.
다양한 기능
색인: 다양한 쿼리의 속도를 빠르게 할 수 있는 여러가지의 색인 기능을 제공한다.
저장 자바스크립트: 저장 프로시저 대신에 자바스크립트 함수와 값을 서버 단에 저장해 쓸수 있다.
집계: 다양한 집계 기능을 제공
고정 크기 컬렉션: 크기가 고정되어 있는 컬렉션은 로그 같은 특정 유형의 데이터에 유용하다.
파일 저장소: 큰 파일과 파일의 메타데이터를 편리하게 저장할 수 있는 프로토콜을 제공한다.
고성능
MongoDB는 모든면에서 고성능을 위해 설계 되었다.
간편한 관리
서버들은 가능하면 스스로 관리하게 설계되어 있다.
Collections
다른 구조의 문서라도 같은 컬렉션에 저장할 수 있는데 왜 별도의 컬렉션이 필요한가?
다른 종류의 문서를 같은 컬렉션에 저장하는 것은 개발자와 관리자에게는 악몽이 될 수 있다. 개발자들은 각 쿼리가 특정 종류의 문서를 반환하거나 그렇지 않다면 쿼리를 수행한 코드가 다른 구조의 문서들을 다룰 수 있는지 확실히 해야 한다.
각 컬렉션별로 목록 뽑기가 한 컬렉션 내 특정 데이터형별로 쿼리해 목록을 뽑을 때보다 훨씬 빠르다.
같은 종류의 데이터를 하나의 컬렉션에 모아 두는 것은 데이터 지역성을 위해서도 좋다.
색인을 만들게 되면 문서는 특정 구조를 가져야 한다. 이러한 색인은 컬렉션별로 정의 한다. 하나의 컬렉션에 단일한 데이터형의 문서를 넣게 되면 보다 효율적인 색인을 생성할 수 있다.
DataBase
MongoDB는 문서를 컬렉션으로 모아 두는 것과 함께, 여러 컬렉션을 데이터베이스로 모은다. 여러 데이터베이스를 호스팅할 수 있으며, 각 데이터베이스를 완전히 독립적으로 취급할 수 있다. 하나의 데이터베이스는 자체 권한을 가지고 있으며 따로 분리된 파일로 디스크에 저장된다. 한 어플리케이션의 데이터는 동일한 데이터베이스에 저장하는 편이 좋다.
설치하기
Download(현재버전 2.2.3) : http://www.mongodb.org/downloads
환경에 맞는 설치 파일을 다운로드 받는다.(저는 Linux 32-bit) 64bit용을 받게되면 메모리 사용에 제약을 받지 않지만 32bit을 사용하는 경우 2G이상 사용할 수 없다고 한다. 일반적인 경우 64bit을 사용하기를 권장하고 있다.
또한 다양한 language의 Driver을 지원하고 있기 때문에 필요한 Driver도 다운 받는다.
Ubuntu OS에 설치해보기
Step 1 ‘.deb’ 페키지를 설치하기 위해 GPG 키를 등록 한다.
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
Step 2 command ‘sudo apt-get update’
Step 3 command ‘sudo apt-get install mongodb’
MongoDB 설정
설정 파일 : /etc/mongodb.conf
실행 설정 파일: /etc/init.d/mongodb.
라이브러리 위치: /var/lib/mongodb
로그 위치: /var/log/mongodb
시작과 종료
Start: command ‘sudo service mongodb start’
Stop: command ‘sudo service mongodb stop’
Restart: command ‘sudo servcie mongodb restart’
초간단 사용해보기
local 접속: ‘mongo’cd
remote 접속: 'mongo localhost:27017/test’ 27017은 default port, test는 기본생성 DB
Shell은 온전한 자바스크립트 해석기로 임의의 자바스크립트 프로그램을 실행할 수도 있다.
yunchang-lee@HSK01-INTER999:/var/log/mongodb$ mongo localhost:27017/test
MongoDB shell version: 2.0.6
connecting to: localhost:27017/test → Connection
> db → 현재 접속한 DB 확인
test
> show dbs → 모든 DB 확인
local (empty)
test (empty)
> use mydb → 사용할 DB 지정, 없는 경우 자동 생성된다.
switched to db mydb
> db → 정말 바꿔졌는지 확인
mydb
> help → 도움말 보기
db.help() help on db methods
db.mycoll.help() help on collection methods
rs.help() help on replica set methods
help admin administrative help
help connect connecting to a db help
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time >= 1ms
show logs show the accessible logger names
show log [name] prints out the last segment of log in memory, 'global' is default
use <db_name> set current database
db.foo.find() list objects in collection foo
db.foo.find( { a : 1 } ) list objects in foo where a == 1
it result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x set default number of items to display on shell
exit quit the mongo shell
> db.help() → DB 메소드 도움말 보기
DB methods:
db.addUser(username, password[, readOnly=false])
db.auth(username, password)
db.cloneDatabase(fromhost)
db.commandHelp(name) returns the help for the command
db.copyDatabase(fromdb, todb, fromhost)
db.createCollection(name, { size : ..., capped : ..., max : ... } )
db.currentOp() displays the current operation in the db
db.dropDatabase()
db.eval(func, args) run code server-side
db.getCollection(cname) same as db['cname'] or db.cname
db.getCollectionNames()
db.getLastError() - just returns the err msg string
db.getLastErrorObj() - return full status object
db.getMongo() get the server connection object
db.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair
db.getName()
db.getPrevError()
db.getProfilingLevel() - deprecated
db.getProfilingStatus() - returns if profiling is on and slow threshold
db.getReplicationInfo()
db.getSiblingDB(name) get the db at the same server as this one
db.isMaster() check replica primary status
db.killOp(opid) kills the current operation in the db
db.listCommands() lists all the db commands
db.logout()
db.printCollectionStats()
db.printReplicationInfo()
db.printSlaveReplicationInfo()
db.printShardingStatus()
db.removeUser(username)
db.repairDatabase()
db.resetError()
db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into { cmdObj : 1 }
db.serverStatus()
db.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all
db.shutdownServer()
db.stats()
db.version() current version of the server
db.getMongo().setSlaveOk() allow queries on a replication slave server
db.fsyncLock() flush data to disk and lock server for backups
db.fsyncUnock() unlocks server following a db.fsyncLock()
> j={name:"mongo"} → 데이터를 넣어보기 위해, JSON 형태의 DATA 생성
{ "name" : "mongo" }
> k={x:3} → 처음과 다른 형태의 JSON 형태 생성, MongoDB는 JSON 형태가 다르더라도 같은 Collection에 넣을 수 있다.
{ "x" : 3 }
> db.things.insert(j) → 생성한 ‘j’ collection 'things’에 넣는다.
> db.things.insert(k) → 생성한 ‘k’ collection 'things’에 넣는다.
> show collections → 어떤 collection들이 있는지 확인해본다.
system.indexes
things → j, k 가 포함된 things가 보인다.
> db.things.find() → things에 포함된 Document을 조회 한다, "_id”는 MongoDB가 collection에 입력되는 순간 자동으로 부여하며, mogoDB내에서 유니크 하다.
{ "_id" : ObjectId("5111e871abd47e5e659ee261"), "name" : "mongo" }
{ "_id" : ObjectId("5111e8f1abd47e5e659ee262"), "x" : 3 }
> for(var i=1; i<=20; i++) db.things.insert({x:4,j:i}) → for 문을 이용해서 다중 문서를 넣어본다.
> db.things.find()
{ "_id" : ObjectId("5111e871abd47e5e659ee261"), "name" : "mongo" }
{ "_id" : ObjectId("5111e8f1abd47e5e659ee262"), "x" : 3 }
{ "_id" : ObjectId("5111e97babd47e5e659ee263"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("5111e97babd47e5e659ee264"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("5111e97babd47e5e659ee265"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("5111e97babd47e5e659ee266"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("5111e97babd47e5e659ee267"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("5111e97babd47e5e659ee268"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("5111e97babd47e5e659ee269"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26a"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26b"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26c"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26d"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26e"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("5111e97babd47e5e659ee26f"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("5111e97babd47e5e659ee270"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("5111e97babd47e5e659ee271"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("5111e97babd47e5e659ee272"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("5111e97babd47e5e659ee273"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("5111e97babd47e5e659ee274"), "x" : 4, "j" : 18 }
has more
> it → 더 있는 경우 ‘it'
{ "_id" : ObjectId("5111e97babd47e5e659ee275"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("5111e97babd47e5e659ee276"), "x" : 4, "j" : 20 }
>
'오래된글 > DataBase' 카테고리의 다른 글
Oracle 중요 Hint (0) | 2018.04.17 |
---|---|
MongoDB, mogo Shell (0) | 2018.04.17 |
MongoDB 제한자 (0) | 2018.04.17 |
Index가 옵티마이저에 의해 수행되는 경우 (0) | 2018.04.15 |
Hashing (0) | 2018.04.15 |