업데이트:
1. MongoDB 소개
MongoDB는 C++로 작성된 문서지향적 NoSQL 데이터베이스이다.
NoSQL 데이터베이스 중 사용 인지도 1위이다.
10gen 이란 회사에서 2007년에 처음 개발했으며 2009년 오픈소스로 전향한 DB이다.
구글, 페이스북, 포스퀘어, 뉴욕타임즈, 이베이 등 주요 대기업 또는 SNS업체에서 많이 사용한다.
Javascript의 JSON(BSON) 형태의 데이터 구조를 가진다.
2. NoSQL이란
SQL(Structured Query Language) : 구조적 질의 언어
NoSQL(No Structured Query Language) : 구조가 없는 질의 언어
즉 Table(Collection)에서 스키마(Schema)를 가지고 있지 않음.
3. Collection와 Document는 뭔가요?
RDBMS = 테이블(Table), 데이터(Row)
MongoDB = 테이블(Collection), 데이터(Document)
기존에 테이블 구조와 전혀 다르기 때문에 명칭을 서로 달리하였다.
4. RDBMS Table의 구조
RDBMS의 테이블은 스키마(Schema)를 가지고 있고 고정된 구조이다.
예) 스키마
wr_id int(11)
wr_subject varchar(255)
wr_content text
5.MongDB 특징
- 여러개의 테이블 구조를 배열 형태로 하나의 컬렉션으로 관리할 수 있다(데이터를 읽을 때 JOIN하는 구조가 아니라 데이터를 생성할 때 JOIN을 하게 된다)
- 고정된 스키마로부터 구애 받지 않고 자유로운 문서 지향 데이터베이스이다
- 다양한 타입 지원 (String, Integer, Boolean, Arrays, Timestamp, Date, Object) 등을 지원한다.
- 읽기 쓰기 효육을 높이고 자동으로 장애 조치를 하고 확장이 용이함(특별한 경우를 제외하고 오류가 잘 안남)
- 여러 서버에 분산 저장 및 확장이 용이하며(Sharding - 파편화), 방대한 데이터 처리가(빅데이터) 빠르다는 장점이 있다.
6. Robomongo 관리툴
- 장점 :
- 난해한 구조인 JSON 형태의 데이터를 일목요연하게 보여준다.
- 컬렉션, 도큐먼트의 관리가 쉽다.
7. 테이블 생성
db.test.insert({
"name":"park",
"age":"30",
"phone:":"010-123-1234",
"addr":"서울특별시 중구"
})
8. 테이블 조회(대소문자 구별)
db.getCollection(‘콜렉션명[테이블명]’).find({}) : 콜렉션내에 있는 데이터를 전체조회
db.[콜렉션명].find({}) 도 가능
예)
db.getCollection('board').find({})
db.board.find({})
- 특정 데이터를 조회방법
db.board.find({ "name" : "Kim" })
- 한 건만 조회
db.board.findOne({ "date" : "2016-11-10" })
- and 조건
db.board.find({ "date" : "2016-11-10", "name" : "Jang" }) db.board.find({ $and : [ { "date" : "2016-11-10"}, { "name" : "Jang" } ] })
- or 조건
db.board.find({ $or : [ { "date" : "2016-11-10"}, { "name" : "Jang" } ] })
- and & or 조건
db.board.find({ "date" : "2016-11-11", { $or:[ {"name" : "Kim" }, {"name" : "Kang" } ]} })
- like 조회(정규표현식 사용가능)
// a문자가 들어가는 모든 필드조회
db.board.find({ "name" : \a\ }) db.board.find({ "name" : { $regex : 'a' } }) // P로 시작하는 모든 필드조회 db.board.find({ "name" : \^P\ }) // g로 끝나는 모든 필드조회 db.board.find({ "name" : \g$\ })
- 부등호 조회
db.board.find({ "hits" : { $gt:10 } // 10보다 큰것 }) db.board.find({ "hits" : { $lt:10 } // 10보다 작은 것 }) db.board.find({ "hits" : { $gte:10 } // 10보다 크거나 같은 것 }) db.board.find({ "hits" : { $lte:10 } // 10보다 작거나 같은 것 }) db.board.find({ "hits" : { $ne:10 } // 10이 아닌 것 }) db.board.find({ $and:[ {"hits" : { $gt:10 }}, {"hits" : {$lte : 25}} ] // hits > 10 and hits < 20 }) db.board.find({ "name":{$exists : true} }) //name필드가 null이거나 not null 인것을 조회
- 정렬 조회
db.board.find({}).sort({ "hits" : 1 }) //1은 오름차순 db.board.find({}).sort({ "hits" : -1 }) //-1은 내림차순 db.board.find({}).sort({ "date" : -1, "hits" : -1 }) //중복정렬 db.board.find({}).limit(3) //3건만 가져옴 db.board.find({}).skip(1) //index는 0 부터 시작하는데 0번째를 건너띄고 조회 db.board.find({}).distinct("date") //date필드만 배열로 조회
9. 테이블 Insert
db.users.insert({ //1건 입력
"name" : "sue"
})
db.users.insert([ //다건 입력
{
"name" : "sue",
"age" : 42,
"status : "A"
},
{
"name" : "park",
"age" : 32,
"status : "S"
},
])
db.users.insertOne({ //1건을 위한 명령어
"name" : "sue"
})
db.users.insertMany([ //다건을 위한 명령어(개발 오류를 줄이기위한 명령어)
{"name" : "sue"},
{"name" : "park"},
{"name" : "kim"},
])
10. 테이블 Update
db.users.update( // 1건만 업데이트함 (다건 X)
{ name : "sue"}, //조건
{
"name" : "sue", //업데이트 내용
"rating" : 1,
"score" : 1,
}
)
db.users.update( //위와 같은 방식으로 update한 것과 동일한 결과
{ name : "sue"}, //조건
{
$set:
{
"name" : "sue", //업데이트 내용
"rating" : 1,
"score" : 1,
}
}
)
db.users.update(
{ name : "sue"}, //조건
{
"name" : "sue", //업데이트 내용
"rating" : 1,
"score" : 1,
},
{ upsert : true } (데이터가 있으면 update, 없으면 insert)
)
db.users.updateOne( //한건만 업데이트 3.2버전에서 추가
{ name : "sue"}, //조건
{
"name" : "sue", //업데이트 내용
"rating" : 1,
"score" : 1,
},
)
db.users.updateMany( //다건 업데이트 3.2버전에서 추가
{ name : "sue"}, //조건
{
$set:
{
"name" : "sue", //업데이트 내용
"rating" : 1,
"score" : 1,
}
}
)
db.users.update(
{ name : "sue"}, //조건
{
$set:
{
"name" : "sue", //업데이트 내용
"rating" : 1,
"score" : 1,
}
},
{ multi : true } //해당되는 모든 데이터가 업데이트됨
)
11. 테이블 remove
db.users.remove({ "name" : "sue" }) //sue를 만족하는 모든 데이터 삭제
db.users.remove({}) //콜렉션의 모든 데이터 삭제
db.users.deleteOne({ //1건만 삭제
name : "Andy"
})
db.users.deleteMany({ // 다건 Andy 필드 모두 삭제
name : "Andy"
})
12. Group 함수
- aggregate : 합계, 총계
db.board.aggregate([ { $group:{ id : "$by_user", // by_user기준으로 count필드에 필드수를 합산하여 보여줌 count:{$sum} } } ]) db.board.aggregate([ { $group:{ id : "$by_user", // by_user기준으로 sum필드의 likes필드의 합산을 보여줌 sum : {$sum : "$likes"} } } ]) db.board.aggregate([ { $group:{ id : "$by_user", // by_user기준으로 sum필드의 likes필드의 평균을 보여줌 avg : {$avg : "$likes"} } } ]) db.board.aggregate([ { $group:{ id : "$by_user", // by_user기준으로 sum필드의 likes필드의 최소값을 보여줌 min : {$min : "$likes"} } } ]) db.board.aggregate([ { $group:{ id : "$by_user", // by_user기준으로 sum필드의 likes필드의 최대값을 보여줌 max : {$max : "$likes"} } } ]) db.board.aggregate([ { $group:{ id : "$by_user", // by_user기준으로 sum필드의 likes필드의 첫번째값을 보여줌 first : {$first : "$likes"} } } ]) db.board.aggregate([ { $group:{ id : "$by_user", // by_user기준으로 sum필드의 likes필드의 첫번째값을 보여줌 last : {$last : "$likes"} } } ])
13. 페이지 처리 기법
- skip과 limit을 사용
db.board.find().skip(0).limit(5) //0부터 시작해서 5건을 가져옴 db.board.find().skip(5).limit(5) //5부터 시작해서 5건을 가져옴
14. Index생성 및 삭제
db.board.createIndex({ subject : 1 }) // subject 필드에 오름차순으로 index생성
db.board.getIndexes() // index조회
db.board.dropIndex({ subject : 1 }) // subject 필드가 오름차순인 필드 삭제
db.board.createIndex({ subject : 1, hits : -1 }) // 두개의 필드에 index 생성
db.board.dropIndex({ subject : 1, hits : -1 })
db.board.createIndex({ subject : 1 }, { unique : true }) // 유니크한 index를 생성, 이 상태에서 동일한 데이터를 insert할 때 오류남
댓글남기기