NoSQL 데이터베이스의 한 종류인 Document 데이터베이스로서 거대한 데이터베이스라는 의미의 Humongous(거대한) DB를 줄여 MongoDB라는 이름을 가진 오픈 소스 데이터베이스
- 오픈소스
- 비관계형(NoSQL)
- Document-Oriented 데이터베이스
구분 | 키-값 DB | 도큐먼트 DB | 컬럼 패밀리 DB | 그래프 DB |
---|---|---|---|---|
장점 | 빠른 성능 | 다양한 데이터 구조 처리 | 대량의 데이터 처리 | 복잡한 관계 처리 |
단점 | 복잡한 구조 처리 어려움 | 대량 데이터 조회 성능 낮음 | 복잡한 관계 처리 어려움 | 데이터 크기가 커지면 확장 및 관리가 어려움 |
구분 | RDBMS | NoSQL |
---|---|---|
데이터 모델 | 고정 행과 열이 있는 테이블 | Key-Value, Document, etc… |
DB 종류 | Oracle, MySQL, postgreSQL, etc… | Redis, MongoDB, Cassandra, etc… |
확장성 | 수직 | 수평 |
인터페이스 | SQL을 통해 데이터 저장 및 검색 가능 | 쿼리 외 다양한 API를 통한 데이터 저장 및 검색 가능 |
장점 | 데이터 중복 배제로 데이터 이상 발생 및 용량 증가 최소화 | 쿼리 프로세싱이 단순화되어 대용량 데이터 처리 성능 향상 |
단점 | 조인이 복잡한 경우 쿼리 프로세싱이 복잡해져 성능 저하 | 데이터 중복에 의해 데이터 일관성 저하 및 용량 증가 |
사용 목적 | - 데이터 무결성 및 일관성이 중요한 트랜잭션 업무 - 복잡한 계산 및 실시간 데이터 정합성이 중요한 업무 | - 로그 및 이력 등의 단순 기록형 업무 - 초당 동시 처리량이 중요한 업무 |
RDBMS | Mongo DB |
---|---|
Database | Database |
Table | Collection |
Row | Document |
Index | Index |
DB server | Mongod |
DB client | mongo |
Primary Key | Primary Key(_id) |
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
var mydoc = {
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
타입 | 번호 | 별칭(Alias) | 비고 |
---|---|---|---|
Double | 1 | "double" | |
String | 2 | "string" | |
Object | 3 | "object" | |
Array | 4 | "array" | |
Binary data | 5 | "binData" | |
Undefined | 6 | "undefined" | Deprecated. |
ObjectId | 7 | "objectId" | |
Boolean | 8 | "bool" | |
Date | 9 | "date" | |
Null | 10 | "null" | |
Regular Expression | 11 | "regex" | |
DBPointer | 12 | "dbPointer" | Deprecated. |
JavaScript | 13 | "javascript" | |
Symbol | 14 | "symbol" | Deprecated. |
JavaScript code with scope | 15 | "javascriptWithScope" | Deprecated in MongoDB 4.4. |
32-bit integer | 16 | "int" | |
Timestamp | 17 | "timestamp" | |
64-bit integer | 18 | "long" | |
Decimal128 | 19 | "decimal" | |
Min key | -1 | "minKey" | |
Max key | 127 | "maxKey" |
<array>.<index>
형태로 인덱스 값에 접근 가능{
...
contribs: [ "Turing machine", "Turing test", "Turingery" ],
...
}
contribs.2
로 접근하면 “Turingery”가 선택됨<embedded document>.<field>
로 하면 됨{
...
name: { first: "Alan", last: "Turing" },
contact: { phone: { type: "cell", number: "111-222-3333" } },
...
}
name.last
contact.phone.number
내용 | |
---|---|
장점 | - 데이터 관리가 직관적 - 쿼리가 단순함 - 조회 성능이 좋음 |
단점 | - 단일 도큐먼트의 크기가 16MB를 넘을 수 없음 - 데이터 불일치 문제 발생 가능성 있음 - 데이터 변경, 추가가 많으면 성능 저하 |
내용 | |
---|---|
장점 | - 데이터가 중복되지 않도록 분리 후 참조하므로 데이터 불일치 발생 가능성 적음 - 데이터가 분리되어 도큐먼트의 크기 증가가 작음 - 데이터 수정, 추가가 도큐먼트 구조에 미치는 영향이 적음 |
단점 | - 참조가 많은 도큐먼트나 대규모 도큐먼트를 조회하는 경우 2차 쿼리로 인한 처리량 증가로 조회 성능이 떨어짐 - 참조 정보를 정확하게 관리하지 않는 경우 참조 정보 소실에 의한 데이터 정합성 문제 발생 가능 |
종류 | 내용 |
---|---|
일반 컬렉션 | - 가장 일반적으로 사용되는 컬렉션 |
캡드 컬렉션 | - 캡드 컬렉션은 고정된 크기를 갖는 컬렉션으로 높은 성능의 로깅 기능을 위해 설계됨 - 명령어 : db.createCollection( "log", { capped : true, size : 100000, max : 100 } ) 1) "log" 컬렉션 생성 시 캡드 옵션을 설정하고 최대 사이즈와 최대 도큐먼트 수를 설정함 2) size : 최대 저장크기로 단위는 Byte임 3) max : 최대 도큐먼트 수로 옵션 생략이 가능함 - 도큐먼트 추가 시 디스크 공간이 없는 경우 가장 오래전에 추가된 도큐먼트부터 덮어쓰기 함 - 오래된 데이터를 수동으로 삭제하는 작업을 없애 데이터 관리가 편리함 - 로깅을 위해 만들어져 사용자가 임의로 삭제하거나 업데이트할 수 없음 |
TTL 컬렉션 | - TTL 컬렉션은 특정 시간이 경과한 도큐먼트를 자동으로 삭제하는 컬렉션으로 TTL 인덱스에 의해 지원되는 기능임 - 명령어 : db.member.createIndex( { modify_date : 1 }, { expireAfterSeconds : 3600 } ) 1) modify_date 필드에 인덱스를 생성하여 1시간(3600/60/60)이 지난 도큐먼트는 삭제함 2) expireAfterSeconds : 도큐먼트의 유지시간을 초 단위로 설정함 - "_id" 필드 또는 이미 다른 인덱스가 있는 필드는 TTL 인덱스를 가질 수 없음 - 캡드 컬렉션인 경우 TTL 인덱스를 가질 수 없음 - 단일 인덱스만 사용 가능하며 복합(Compound) 인덱스를 가질 수 없음 |
시스템 컬렉션 | - mongoDB 내부에서 사용되는 컬렉션으로 사용자가 지정하여 사용할 수 없음 |
**db.user.createIndex({score:1})
** 형태로 사용**db.user.createIndex({userid:1 ,score:-1})**
형태로 사용userid-score
와 score-userid
는 다른 인덱스- 생성된 인덱스: { a: 1, b: -1 }
- 지원하는 조회 쿼리: { a: 1, b: -1 }
- 지원하는 조회 쿼리: { a: -1, b: 1 }
- 지원하지 않는 조회 쿼리: { b: 1, a: 1 }
- 지원하지 않는 조회 쿼리: { b: -1, a: -1 }
- 생성된 인덱스: { "item": 1, "location": 1, "stock": 1 }
- 지원되는 쿼리: { item: 1 }
- 지원되는 쿼리: { item: 1, location: 1 }
- 지원하지 않는 조회 쿼리: "item" 필드 없이 "location" 필드만 존재 혹은 "stock" 필드만 존재
- 지원하지 않는 조회 쿼리: "item" 필드 없이 "location", "stock" 필드만 존재
- 인덱스 1: { qty: 1 }
- 인덱스 2: { item: 1 }
> db.orders.find( { item: "abc123", qty: { $gt: 15 } } )
db.collection.insertOne()
db.collection.insertMany()
db.collection.find()
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
db.collection.deleteOne()
db.collection.deleteMany()
References
https://www.mongodb.com/docs/manual
https://www.mongodb.com/json-and-bson
https://www.ibm.com/kr-ko/topics/mongodb
https://meetup.nhncloud.com/posts/275
https://hoing.io/archives/1379
https://wikidocs.net/190392
https://azderica.github.io/00-db-nosql/
https://velopert.com/479
https://inpa.tistory.com/entry/MONGO-📚-몽고디비의-데이터-관계-모델링-💯-정리
https://kciter.so/posts/about-mongodb
https://ryu-e.tistory.com/1
https://velog.io/@suhongkim98/MongoDB-기본#챕터-3-도큐먼트-생성-갱신-삭제
https://jaehoney.tistory.com/314
https://tychejin.tistory.com/349