DATABASE-NoSQL(MongoDB)
MongoDB
MongoDB Setting
MongoDB 설치 및 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14sudo apt update -y
sudo apt upgrade -y
sudo apt install -y mongodb
sudo systemctl status mongodb
sudo vi /etc/mongodb.conf
bind_ip = 0.0.0.0
auth = true
패스워드 설정
mongo
use admin
db.createUser({ user: "rada", pwd: "radapw", roles: [ "root" ] })
quit()
sudo systemctl restart mongodb
aws 인스턴스 27017 포트 접속 허용mongo 명령어를 입력하면 mongo shell에 접속됩니다.
Install Robomongo
https://robomongo.org/ 페이지에서 경로에서 ROBO 3T 다운로드 후 설치 합니다.
Connection
MongoDB Connections에서 ip를 입력하여 서버의 mongoDB에 접속합니다.
문법
ref : https://docs.mongodb.com/v3.6/reference/
Create Database
mongo 라는 이름의 데이터 베이스 생성
1
use mongo
현재 사용중인 데이터 베이스 확인
1
db
database list 확인
1
show dbs
- 데이터 베에스를 생성후에 최소 1개이상의 document를 추가해야 생성된 데이터 베이스가 보인다
- document 생성
<!--hexoPostRenderEscape:<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> mongo</span><br><span class="line">db.user.insert({<span class="string">"name"</span>:<span class="string">"alice"</span>, <span class="string">"age"</span>:<span class="number">20</span>, <span class="string">"email"</span>:<span class="string">"alice@gmail.com"</span>})</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
Delete Database
- 현재 사용중인 데이터 베이스 삭제
1
db.dropDatabase()
- 현재 사용중인 데이터 베이스 삭제
Create Collection
refer https://docs.mongodb.com/v3.6/reference/method/db.createCollection/
syntax
1
db.createCollection(collection 이름, [option])
option
- capped : true로 설정하면 collection의 최대 용량을 설정 (최대 용량의 크기는 size 옵션으로 설정), 설정된 최대용량 이상으로 데이터가 입력되면 오래된 데이터 부터 자동으로 삭제됩니다.
- autoIndex : true로 설정하면 _id 필드에 index가 자동으로 생성됩니다.
- size : 숫자 데이터를 사용하며 collection의 최대 사이즈를 byte 단위로 지정
- max : 숫자 데이터를 사용하며 최대 document 갯수를 설정
user 컬렉션을 생성
1
db.createCollection("user")
autoIndex와 max 옵션을 설정하여 info 컬렉션을 생성
1
2db.createCollection("info1", { autoIndexId: true, capped: true, size: 500, max:5 })
db.createCollection("info2", { autoIndexId: true, capped: true, size: 50, max:5 })createCollection을 사용하지 않고 article 컬렉션을 생성
1
db.articles.insert( {"title":"data science", "contents":"mongodb" } )
컬렉션 리스트 확인
1
show collections
Delete Collection
- articles 컬렉션 삭제
1
db.articles.drop()
- articles 컬렉션 삭제
Make Document
syntax
1
db.<collection_name>.insert(<document>)
info 컬렉션에 document 추가
1
2
3db.info1.insert({ "subject":"python", "level":3 })
db.info1.insert({ "subject":"web", "level":1 })
db.info1.insert({ "subject":"sql", "level":2 })한번에 여러개의 document 추가
max:5 옵션 제한에 걸려 5개의 데이터가 info1에 들어간다.
1
2
3
4
5
6
7
8db.info1.insert( [
{ "subject":"python", "level":3 },
{ "subject":"web", "level":1 },
{ "subject":"sql", "level":2 },
{ "subject":"python", "level":3 },
{ "subject":"web", "level":1 },
{ "subject":"sql", "level":2 },
])size:50 옵션 제한에 걸려 4개의 데이터가 info2에 입력된다.
1
2
3
4
5
6
7db.info2.insert( [
{ "subject":"python", "level":3 },
{ "subject":"web", "level":1 },
{ "subject":"sql", "level":2 },
{ "subject":"python", "level":3 },
{ "subject":"web", "level":1 },
])info collection 생성하면서 document 추가
1
2
3
4
5
6
7
8db.info.insert( [
{ "subject":"python", "level":3 },
{ "subject":"web", "level":1 },
{ "subject":"sql", "level":2 },
{ "subject":"java", "level":3 },
{ "subject":"html", "level":1 },
{ "subject":"css", "level":2 },
])
Delete Document
- level2인 데이터 삭제 : 제약조건이 걸려있는 컬렉션의 도큐먼트는 삭제가 안됩니다.
1
db.info.remove( {level:2} )
- level2인 데이터 삭제 : 제약조건이 걸려있는 컬렉션의 도큐먼트는 삭제가 안됩니다.
Find
ref : https://docs.mongodb.com/manual/reference/method/db.collection.find/index.html
syntax
1
db.collection.find(query, projection)
query : document 조회 조건을 설정. 모든 document를 조회 할때는 ({})를 사용
projection : document를 조회할때 보여지는 필드(컬럼)를 정의
query
기본 document 조회
info 컬렉션에 있는 모든 document 조회
1
2db.info.find()
db.getCollection('info').find({})subject가 python인 document 조회
1
db.info.find({"subject": "python"})
비교 연산자
ref : https://docs.mongodb.com/v3.6/reference/operator/query/
level이 2 이하인 document를 조회
1
db.info.find({"level": {$lte: 2} })
level이 3 이상인 document를 조회
1
db.info.find({"level": {$gte: 3} })
subject가 java와 python을 포함하는 document 조회
1
db.info.find( {"subject": {$in: ["java", "python"]}} )
논리 연산자
- $or : 조건중 하나라도 true이면 true
- $and : 모든 조건이 true이면 true
- $not : 조건중 하나라도 false이면 true
- $nor : 모든 조건이 false이면 true (or와 반대 개념)
subject가 python이고 level이 3이상인 document 조회
1
db.info.find({ $and: [ { "subject":"python" }, { "level": {$gte: 3} } ] })
subject가 python이아니고 level이 1이하가 아닌 document 조회
1
db.info.find({ $nor: [ { "subject":"python" }, { "level": {$lte: 1} } ] })
level이 2보다 크지 않은 document 조회 (2 포함)
1
db.info.find({ "level": { $not: {$gt: 2} } })
$where
$where 연산자를 사용하면 자바스크립트 표현식 사용이 가능합니다.
level이 1인 document 조회
1
db.info.find( { $where: "this.level == 1"} )
projection
document를 조회할때 보여지는 필드(컬럼)를 정의합니다.
Basic
subject와 comments만 출력되도록 find
- 설정을 true 값을 설정하던가 false 값을 설정합니다. ( _id는 따로 설정을 안하면 true )
1
2
3db.info.find({},{"_id":false, "level":false})
db.info.find({},{"subject":true, "level":true})
db.info.find({},{"_id":false, "subject":true, "level":true})
- 설정을 true 값을 설정하던가 false 값을 설정합니다. ( _id는 따로 설정을 안하면 true )
Find Method
find method를 사용하면 find를 사용한 document의 결과를 가공하여 출력할수 있습니다.
sort
- document를 정렬시켜 줍니다.
- ‘sort({key: value})’ 와 같은 포멧으로 사용을 하며 key는 정렬할 필드명을 작성하고, value는 오름차순은 1, 내림차순을 -1을 넣어주면 됩니다.
info 컬렉션의 document를 level 오름차순으로 정렬
1
db.info.find().sort({"level":1})
info 컬렉션의 document를 level 내림차순으로 정렬
1
db.info.find().sort({"level":-1})
level을 기준으로 내림차순으로 정렬한 후 subject를 기준으로 오름차순으로 정렬
1
db.info.find().sort({"level":-1, "subject":1})
limit
limit을 사용하면 document출력 결과의 수룰 제한할수 있습니다.
document의 결과를 3개 까지만 출력
1
db.info.find().limit(3)
document의 결과를 level로 내림차순으로 정렬하고 3개까지만 출력
1
db.info.find().sort({"level":-1}).limit(3)
skip
skip을 검색한 document의 결과의 시작부분을 설정할때 사용합니다.
document를 3번째 부터 출력
1
db.info.find().skip(2)
limit, skip을 함께 사용해서 mysql의 limit과 같이 사용할수 있습니다.
update
ref : https://docs.mongodb.com/manual/reference/command/update/index.html
syntax
1
db.collection.update( query, update, { upsert: <bool>, multi: <bool> })
upsert : insert와 update의 합성어 (데이터가 있으면 update, 없으면 insert 한다는 의미)
multi : true로 설정되면 여려개의 document를 수정합니다. 기본값은 false
특정 document를 새로운 document로 수정하기
1
2
3
4
5
6
7
8
9
10db.info.update(
{ "subject": "html" },
{ "subject": "sass", "level":2}
)
db.info.update(
{ "subject": "less" },
{ "subject": "less", "level": 2},
{ "upsert": true}
)
$set, $unset
$set을 사용하면 특정 document의 필드를 수정할수 있습니다.
$unset를 사용하면 특정 document의 필드 제거할수 있습니다.
python의 level을 3으로 수정 (한개의 데이터만 수정)
1
db.info.update( { subject: "java" }, { $set: { level: 4 } } )
level 2를 level 1로 수정 (여러개의 데이터 수정)
1
2
3
4
5db.info.update(
{ level: 2 },
{ $set: { level: 1 } },
{ multi: true }
)subject가 sass인 document의 level필드 삭제
1
2
3
4db.info.update(
{ subject: "sass" },
{ $unset: {level: 1} }
)level: 1의 1은 true를 의미합니다.
level이 2이하인 데이터를 1로 수정하기
1
2
3
4
5db.info.update(
{ level: {$lte: 2} },
{ $set: {level: 1} },
{ multi: 1 }
)level이 없는 데이터 level 추가하기
1
2
3
4
5db.info.update(
{ level: {$exists: false} },
{ $set: {level: 2} },
{ multi: 1 }
)
Function
자바스크립트 문법으로 함수 작성이 가능합니다.
skip 함수
1
2
3
4
5var showSkip = function(start){
return db.info.find().skip(start)
}
showSkip(3)