문서지향적
Cross-platform 데이터베이스관계형 데이터베이스(RDB)
라고 지목했다. 경직된 아키텍처, 비싼 비용, 부족한 확장성 등을 RDB의 문제점으로 꼽았다.그는 “
RDB
를 쓰면 수많은 시스템이 연결돼야 서비스를 제공할 수 있어 복잡성과 비용 모두 증가한다”며 “다양한 기술과 인터페이스를 각기 다른 방식으로 관리해야 하므로 혁신이 느려진다”고 말했다. 카힐 부사장은 “도큐먼트가 많이 조인
된다면 기존보다 2배 빨라지고, 선별적인 소수의 조인이라면 5~10배 빨라지며, 사람이 실시간으로 분석하면서 미리 인덱스 없이 쿼리를 던질 때 100배 빨라진다”며 “새 쿼리 엔진과, 실시간 인앱 분석 쿼리 지원 강화로 몽고DB의 데이터 저장 방식도 애널리틱스 쿼리의 경우 별도 컬럼스토어로 할 수 있는 ‘컬럼스토어 인덱스’를 추가했다”고 밝혔다.
스택 오버플로우를 보면 가장 원하는 데이터베이스 기술에 3년 연속 1위를 했으며, 기술 순위 5위 안에 드는데 그 중 3위까지가 RDBMS라고 한다. NoSQL에서 강세라는 것..
종류 | 예시 |
---|---|
키-값 스토어 | Redis, Dynamo |
컬럼 지향 스토어 | HBase, Cassandra |
도큐먼트 지향 스토어 | MongoDB |
그래프 데이터베이스 | Neo4J |
그렇다면 그게 뭔데?
🔗 https://brunch.co.kr/@skykamja24/575
Redis는 REmote DIctionary Server의 약어로 Key와 Value를 가진 오픈소스 NoSQL 데이터베이스이다. 시스템메모리를 사용하는 키-값 데이터 스토어로 문서형 데아터베이스보다 빠르고 가볍게 동작한다고 한다. 레디스와 백엔드 프레임워크의 궁합이 좋으며, 보통 aws와 많이 쓰는 것 같다. 운영 중인 웹 서버에서 키-값 형태의 데이터 타입을 처리해야 하고 I/O가 빈번히 발생해 다른 저장 방식을 사용하면 효율이 떨어지는 경우의 사용
JavaScript
를 활용하기에 친숙함JSON
과 유사한 형태로 저장하는 방식 채용이러한 기능은 어디에 쓰일까?
이를테면, 무료 송금 어플리케이션 개발시 계좌정보 저장하는데 송금시스템이 통째로 멈추면 안되니, 애플리케이션은 안전성이 중요하기 때문에 데이터 불러올 때 실패하지 않으려면 복제가 필요하다.
확장성
: 애플리케이션에서 필요한 데이터베이스 노드가 하나이거나 혹은 그 이상이거나 관계없이 좋은 성능 도큐먼트 모델
에서는 대부분의 상품 정보를 하나의 도큐먼트로 표현할 수 있다.{
_id: 10,
username: 'geum',
password: 1234,
email: 'prs212@naver.com',
hobby : 'read book'
}
Collection
안에 있는 DocumentCollection
: MongoDB 도큐먼트 그룹으로 도큐먼트들이 Collection 내부에 위치하며, table과 비슷한 개념이나, 스키마를 따로 가지고 있지 않다.조인
을 하기 위해 이메일 주소와 사용자 테이블을 각각 만들어야 할 것유연성
: 스키마 맞춰야 하는 걱정없이 구조화된 도큐먼트를 데이터 베이스에 저장할 수 있다 {
_id: 10,
username: 'geum',
password: 1234,
email: ['prs212@naver.com',
'sdg212@gmail.com'],
hobby : 'read book'
}
RDBMS | MongoDB |
---|---|
Database | Database |
Table | Collection |
Tuple/Row | Document |
Column | Key/Field |
Table Join | Embedded Documents |
Primary Key | Primary Key(_id) |
Database Server & Client | |
mysqld | mongod |
mysql | mongo |
컬렉션(collection)
에 도큐먼트로 저장하는 반면, MySQL 이나 다른 RDBMS 에서는 데이터를 테이블의 행
으로 저장스키마
도 필요하지 않는다.가변적인
속성을 갖는 데이터를 표현 가능 도큐먼트
로 데이터 모델링을 하게 되면 조인이 필요 없고, 새로운 속성은 한 도큐먼트에 동적으로 추가애드혹 쿼리(ad-hoc-query)
는 사용자가 직접 쿼리 명령 및 함수를 사용하여 직접 입력하는 방식으로 데이터를 추출하는 쿼리를 의미B-Tree 인덱스
로 구현되어 있다.고유의 식별자
로서 프라이머리 키(Primary Key) 를 부여하며, 기본 키는 자동적으로 인덱스되며 고유한 값을 유지 하기 위해서 유니크 키 를 사용하게 된다.🔗 https://www.mongodb.com/try/download/community-kubernetes-operator
- 윈도우에서 몽고 데몬이 서비스 형태로 동작해야 함
- Complete > Install MongoDB a Service [Run sevice as Network Service user] 로 설치
환경변수
에 등록할 것[ZIP파일 시 등록해야 할 수 있으니 msi로 하자]use
명령이용use
명령으로 삭제하고 싶은 DB 선택컬렉션
이란 스키마 없이 자유롭게 작성된 여러 개의 문서를 보관하는 저장소 {}
안에 작성띄어쓰기
가 있다면 db[”컬렉션이름”]으로 해줘야함컬렉션
만들고 그 안에 객체를 넣어줌 ⇒ 그 후 컬렉션 삭제\이름.insertOne
형태 명령시 컬렉션 자동 생$gt
처럼 달러 기호를 접두사로 사용하는 키워드연산자 이름 | 의미 |
---|---|
$eq | 필드_값 == 값 |
$ne | 필드_값 ≠ 값 |
$gt | 필드_값 > 값 |
$gte | 필드_값 ≥ 값 |
$lt | 필드_값 < 값 |
$lte | 필드_값 ≤ 값 |
$in 과 $nin
연산연산자 이름 | 의미 |
---|---|
$in | 하나라도 매치되면 해당 문서 반환 |
$nin | 하나도 매치되지 않는 문서 반환 |
연산자 이름 | 용도 |
---|---|
$set | 특정 필드값 변경시 사용 |
$inc | 문서 숫자 타입 필드값 증가 시 사용 |
$dec | 문서 숫자 타입 필드값 감소 시 사용 |
⇒ 최신 버전에서 사용 못한다고 함 |
주의해야 할 점 : insertMany를 할 때 전부
[]
로 묶어주기
db.mongotest.insertMany([
{ item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [{ warehouse: "A", qty: 5 }] },
{ item: "notebook", status: "A", size: { h: 8.5, w: 11, uom: "in" }, instock: [{ warehouse: "C", qty: 5 }] },
{ item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [{ warehouse: "A", qty: 60 }] },
{ item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [{ warehouse: "A", qty: 40 }] },
{ item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [{ warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 }] },
{ item: "hat", status: "B", size: { h: 12, w: 12, uom: "cm" }, instock: [{ warehouse: "C", qty: 20 }] },
{ item: "shovel", status: "B", size: { h: 80, w: 12, uom: "cm" }, instock: [{ warehouse: "C", qty: 100 }] },
{ item: "broom", status: "C", size: { h: 80, w: 8, uom: "cm" }, instock: [{ warehouse: "A", qty: 5 }, { warehouse: "C", qty: 5 }] }
]);
.
연산자로 오브젝트 안에 들어있는 값 불어오기 위한 접근 가능db.inventory.find({"size.uom":"in"})
참고
필드이름.0 : 배열의 인덱스 첫 번째 요소를 찾을 수 있음
db.mongotest.find({status: {$in: ["C", "D"]}})
db.mongotest.find({"size.w": {$lt: 15}, "size.h": {$gte:50, $lte:100}})
db.people.insertMany([
{ name: "Kim", age: 21 },
{ name: "Lee", age: 22 },
{ name: "Jung", age: 27 },
{ name: "Park", age: 27, skills: ["mongodb", "python"] },
{ name: "Choi", age: 22, score: 10 }
]);
db.people.find({})
db.people.deleteOne({name : "Jung"})
db.people.updateOne({name : "Lee"}, {$set : {name :"Lim", age: 25}});
db.people.updateOne({name : "Kim"}, {$set : {age : 20}})
db.people.updateOne({ name: "Park" }, { $unset: { skills: "" } })
db.people.updateOne({ name: "Choi" }, { $inc: { score: -2 } })
db.score.insertMany([({name:"Kim junsung",kor:90,eng:71,mat:88}),
({name:"Lee jiyeon",kor:80,eng:87,mat:78}),
({name:"Park heji",kor:60,eng:80,mat:58}),
({name:"Kim yura",kor:89,eng:83,mat:75}),
({name:"Choi jinsu",kor:54,eng:91,mat:68}),
({name:"Lee jisun",kor:95,eng:88,mat:98})]);
db.score.find({})
참고
쿼리가 어떤 도큐먼트를 불러올지를정하는 파라미터라면,프로젝션
은 각각의 도큐먼트를 어떤 필드를 노출할지 결정해주는 파라미터 => 원하는 필드만 가지고 옴 true(1), false(0) 둘다 있다면 에러남
단, _id는 제외
db.score.find({}, {_id:0, name:1, mat:1})
db.score.find({mat : {$gte : 70}})
find()
메서드에서 조건을 지정할 때는 두 번째 인자로 전달되는 프로젝션 객체에만 필드를 포함하거나 제외시킬 수 있다.db.score.find({kor : {$gte : 80}}, {_id:0, name:1, kor:1})
^
: 문자열의 시작을 나타냄L
: 문자 "L"을 나타냄.*
: 임의의 문자가 0번 이상 반복되는 것을 나냄$
: 문자열의 끝을 나타냄db.score.find({name : {$regex : /^L.*$/}})
예를 들어 회원에 대한 컬렉션과 회원의 포인트에 대한 컬렉션이 각 각 따로 있다.
내 애플리케이션의 많은 부분이 회원정보와 포인트에 대한 정보에 동시에 접근하게 되면, 코드를 간결하게 유지하고 가독성을 높이기 위해 회원정보와 포인트를 한 번에 불러올 수 있는 뷰를 만들어 활용 가능
집계 파이프라인
문법 이용 db.getFreeMonitoringStatus()
된다고 해서 해보니 된다.
3. 이 기능을 이용하면 원격으로 데이터 베이스의상태를 알 수 있다고 한다.
p.42
mongoDB는 CRUD 작업에대해 원자성을 확보하고 있다. 즉, 데이터베이스에는 작업이 완료된 상태가 되거나 완료되기 전 상태만 존재하지 그 중간 상태는 존재하지 않는다는 것이다.
insertOne
함수의 경우 따로 어떤 작업을 하지 않아도 원자성을 가지고 있다.예를 들어 ATM 기기에 1만원을 넣고 2만원을 빼려고 했는데 1만원 넣기는 성공했는데 2만원 빼기는 실패 시 이 작업 전체는 원자성을갖추지 못하게 된다. => 이런 것을 해결하기 위해 나온 것 '트랜잭션'
board 데이터베이스 작업
자유게시판이랑 비밀게시판을 생성한다.
freeboard_result = db.board.insertOne({name : "자유게시판"})
freeboard_id = freeboard_result.insertedId
db.articla.insertMany([{board_id: freeboard_id, title : 'hello', content: 'hi, hello1', author : 'Karoid'},{board_id : freeboard_id, title:'hi', content:'ji, hello2', author:'Jeong'},{board_id: freeboard_id, title : 'hel', content: 'hi, hello3', author : 'Kim',comments: [{author : 'Karoid', content : 'hello Hong'}]},])
몽고디비 문법 익숙해지는데는 시간이 걸릴 것 같다... 사람들이 몽고디비 몽고디비해서 뭘까 했는데.. 가장 좋은 이유가 가변적인것에 확장적이라는 점, 스키마가 없다는 점인 것 같다. SQL도 다 잊어버린 것 같은데... 할 거 너무 많다... CS도 해야하고 프로젝트 다가오니 프로젝트에 내야 할 것도 많고 CS 스터디 공부도 해야하는데 많이 하는데 머리 속이 정리가 안된 느낌...
이번주에 해야 할 것 : 점핏 2부 강의 듣기, 자소서 내기, 노션에 포트폴리오 틀 잡기, 금요일에 멘토링 신청한 거 질문에 대한 답변 적기, SQL 깃허브 리포지토리 따로 파서 정리하기
블로그에 올릴 글 : CS 스터디에서 한 부분 보충, 점핏 2부, 8월 회고록 ... 등등
가능하다면... 독서 저번주에 못한 4장 마저 하자.. 취업전까지 주니어가 읽어야 하는 테스트 부분까지는 읽기
화이팅..