Search
Duplicate
📒

[비즈니스 요구사항 MongoDb] 01-2.

수업
비즈니스 요구사항 MongoDB
주제
기본개념
연관 노트
4 more properties
참고

1. 목차

NOTE

목차

NOTE

기본구조

DB구조 비교
collections이 무엇인가
Table 개념이다
동적 스키마를 가진다 ⇒ 고정된 구조가 없음
Document(Row)를 삽입하면 자동으로 만들어진다
그룹핑을 하는데 내부규칙이 없는 느낌
biJson형식으로 저장된다? (바이너리 형태)
id는

배포형태

레플리카 셋 (몽고디비 3개 설치, Primary가 Secondary에 비동기로 복제함) HA보장 이거만 해도 서비스개발에 문제없음
Replica Set Arbiter (PSS를 쓰자)
Oplog ⇒ op(어떤 연산을 수행했는가)에 대한 로그 이를 이용해 Secondary가 복제함
샤드 클러스터(고가용성, 분산)
개념만 설명한다.
라우터를 통해 접근해야한다. (샤드에 직접접근하면 문제가 생길 수 있음)
Collection이 샤딩된 모습 (2처럼 안될수도 있음)
하나의 샤드가 유리한 경우도 존재한다. 데이터가 분산되면 합쳐지는 시간이 있기때문.
샤드 → 청크를 이용해 분산, 균등한 분산이 이루어지도록 해줌
샤딩의 전략
Ranger Sharding ⇒ 균등한 분산이 어려움
Hash Sharding ⇒ 균등한 분산이 잘됨, 브로캐스트 쿼리, 가능하면 이걸로 한다.
Zone Sharding ⇒ Ranger와 같이쓴다, 글로벌 분산에 사
서버의 용량이 적으면 분산, 충분하면 레플리카 셋
Replica Set은 Write에 대한 분산이 불가능하다.
Clsuter하나를 사용해도 전체 에러로 번질 수 있음, 나눠야한다.
쓰기에서는 확실히 shard가 유리하다.

Storage Engine

WiredTiger를 도입하면서 굉장히 좋아짐
Data Compression ⇒ 데이터 압축
Lock ⇒ Row 레벨의 Lock가능

몽고디비 구축

NOTE
세상이 좋아졌다. 디비도 클라우드로 쓰는 시대 ㄷㄷ
심지어 무료임
shell로 접속한다.
남은 강의에서 로컬설치도 다루는데 따로 정리하진 않겠다.
레플리카, 샤딩 설치방식을 다루는데 설정해줄게 많다.

shell 이외의 접근방법

vscode
Composs ⇒ 전용 GUI툴
Cluster ⇒ 파이썬, 노드와 같은걸로 바로 접근가능

MongoDB 쿼리

NOTE
SQL vs MQL(MongoDB Query Language
select * from table;
db.collection.find({})
쿼리 필터와, 오퍼레이션
오퍼레이터 ⇒ 연산을 수행하기 위해 몽고디비가 지원, 쿼리필터와 자주쓰임
show dbs; use test //// 데이터 삽입 db.employees.insertOne({ name: "lake", age : 21, dept: "Database", joinDate: new ISODate("2022-10-01"), salary: 400000, bonus: null }) db.employees.find() db.employees.insertMany([ { name: "lake", age : 45, dept: "Network", joinDate: new ISODate("1999-11-15"), salary: 400000, resignationDate: new ISODate("2022-12-23"), bonus: null }, { name: "river", age : 34, dept: "DevOps", isNegotiating: true, }, ]) db.employees.find() //// inserMany가 한번에 넣으면 훨씬 빠름 for(i =0; i<300; i++){ db.insertTest.insertOne({a:1}) } var docs = []; for(i =0; i<300; i++){ docs.push({a:1}) } db.insertMany.insertMany(docs); //// 데이터 변경 db.employees.updateOne( { name: "river" }, { $set:{ salary: 35000, dept: "Database", joinDate: new ISODate("2023-12-31") }, $unset: { isNegotiating: "" } } ) db.employees.updateMany( { resignationDate: {$exists: false}, joinDate: {$exists: true}}, { $mul:{salary: Decimal128("1.1")}} ) //// 이런식으로 하면 bonus 필드가 아예없어도 생기게해버림 (exists로 해주자) db.employees.updateMany( { resignationDate: {$exists: false}, bonus: null}, { $set:{bonus: 10000}} ) db.employees.updateMany( { resignationDate: {$exists: false}, bonus: {$exists: true}}, { $set:{bonus: 10000}} ) db.employees.updateOne( { name: "river"}, { $unset:{bonus: ""}} ) db.employees.find() //// 삭제 db.employees.deleteOne({name: "river"}) //// 전체삭제 (컬렉션(테이블을 남아있음)) db.employees.deleteMany({}); show collections show dbs //// find 공부 use sample_guides show collections db.planets.findOne({name: "Mars"}) db.planets.find({ hasRings: true, orderFromSun: {$lte: 6} }) db.planets.find({ $or: [ {hasRings: {$ne: false} }, {orderFromSun: {$gt: 6}} ] }) db.planets.find({ mainAtmosphere: {$in: ['O2']} })
Java
복사

유용한 함수(실습위주)

db.collection.bulkWrite( [ <operation 1>, <operation 2>, ... ], { writeConcern : <document>, ordered : <boolean> // 순서 상관없이 실행됨 } )
Java
복사
db.bulk.bulkWrite( [ {insertOne: {doc: 1, order: 1}}, {insertOne: {doc: 2, order: 2}}, {insertOne: {doc: 3, order: 3}}, {insertOne: {doc: 4, order: 4}}, {insertOne: {doc: 5, order: 5}}, { deleteOne:{ filter: {doc: 3} } }, { updateOne:{ filter: {doc: 2}, update: { $set: {doc:12}} } } ] )
Java
복사
네트워크 라운드 트립 줄인다.
db.sequence.findAndModify({ query: {}, sort: { seq: -1 }, update: { $inc: {seq: 1}} })
Java
복사
MongoDB는 AutoIncreaseMent가 없으므로 시퀀스 제어하는것이 있다.
use sample_supplies
Java
복사

목차

NOTE

1. 목차

NOTE

목차

NOTE