참고
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가능
몽고디비 구축
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
•
•