MongoDB
Document Oriented 문서지향적 데이터베이스
뛰어난 확장성과 성능 자랑
NoSQL -> Not Only SQL
기존 RDBMS의 한계를 극복하기 위하여 만들어진 새로운 형태의 데이터저장소로 관계형 DB가 아니므로 고정된 스키마 및 JOIN이 존재하지 않는다.
- Document
- BASE
- Open source
장점 | 단점 |
DATA를 JSON 형태로 처리 -> 빠르게 JSON 전환 가능 | 표준이 없음 = 제약이 없음 |
DB 구조의 변경 용이 | 데이터가 구조화 되어 있지 않음 (단순한 구조의 쿼리만 사용 가능) |
제약이 없기에 높은 수평 확장성, 스키마 설계의 유연성 | 데이터의 일관성 및 안정성을 DB가 아닌 APP레벨에서 관리해줘야 함, 버그 발생 확률 높음 |
Document는 동적 스키마를 가지고 있고, 같은 Collection 안에 있는 Document 끼리 다른 스키마를 가지고 있을 수 있다.
즉, 서로 다른 데이터(다른 key)를 가지고 있을 수 있다.
MongoDB의 구조
Database -> Collection -> Document -> Field 계층으로 구성
Collection
MongoDB의 Document의 그룹 의미
Collection 내부에 Document들이 위치하고 있다.
RDMS의 table과 비슷한 개념이다.
Document
RDBMS의 행(row)에 해당
MongoDB는 BSON으로 데이터가 쌓이기 때문에 Array 데이터나 nested한 데이터를 쉽게 넣을 수 있다.
MongoDB Atlas 웹 클라우드 사용하기
https://www.mongodb.com/ko-kr/cloud/atlas/efficiency
const { MongoClient, ServerApiVersion } = require('mongodb');
const uri = "mongodb+srv://유저명:패스워드@cluster0.y4isdtc.mongodb.net/?retryWrites=true&w=majority";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
client.connect(err => {
const collection = client.db("test").collection("devices");
// perform actions on the collection object
client.close();
});
만들어준 collection을 출력해주면,
Collection {
s: {
db: Db { s: [Object] },
options: {
raw: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
ignoreUndefined: false,
bsonRegExp: false,
serializeFunctions: false,
fieldsAsRaw: {},
writeConcern: [WriteConcern],
readPreference: [ReadPreference]
},
namespace: MongoDBNamespace { db: 'kdt5', collection: 'test' },
pkFactory: { createPk: [Function: createPk] },
readPreference: ReadPreference {
mode: 'primary',
tags: undefined,
hedge: undefined,
maxStalenessSeconds: undefined,
minWireVersion: undefined
},
bsonOptions: {
raw: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
ignoreUndefined: false,
bsonRegExp: false,
serializeFunctions: false,
fieldsAsRaw: {}
},
readConcern: undefined,
writeConcern: WriteConcern { w: 'majority' },
slaveOk: false
}
}
mongoDB 패키지 설치
npm i -S mongodb@4.0.0 으로 설치
- 4.0.0 버전을 설치하여 콜백으로 연습하고
- 5.0 이상 버전에선 콜백을 지원하지 않으므로 async await를 쓰도록 한다.
client.connect((err) => {
const collection = client.db('kdt5').collection('test');
client.close();
});
해당 코드로 인하여 kdt5라는 db에 test라는 collection이 생기도록 만들 수 있다.
즉, 몽고db의 구조에 따라 가장 먼저 db명을 써주고 collection명을 써줘서 컬렉션을 만들어줄 수 있다.
JSON과 유사한 구조라 다루기 편함
insertMany([{ }, { }, ...], (err, result) => { });
많은 데이터(Document)를 한꺼번에 삽입
해당 쿼리의 성공 여부는 리턴된 객체(result)의 acknowledged 값을 통해 확인 가능
acknowledged 값이 true면 성공한 것임
하나의 데이터를 삽입할 땐, insertOne({ }, (err, result) => { }); 을 사용
deleteMany({조건들}, (err, result) => { });
많은 데이터를 한꺼번에 삭제,
데이터베이스를 한번에 정리할 때 사용해줌
해당 쿼리의 성공 여부는 리턴된 객체(result)의 acknowledged 값을 통해 확인 가능
조건 객체를 채우지 않으면 모든 데이터가 삭제된다.
const { MongoClient, ServerApiVersion } = require('mongodb');
const uri =
'mongodb+srv://guseulgi:qwer1234@cluster0.y4isdtc.mongodb.net/?retryWrites=true&w=majority';
const client = new MongoClient(uri, {
useNewUrlParser: true,
useUnifiedTopology: true,
serverApi: ServerApiVersion.v1,
});
client.connect((err) => {
const collection = client.db('kdt5').collection('test');
collection.deleteMany({}, (deleteErr, deleteResult) => {
if (deleteErr) throw deleteErr;
console.log('deleteResult', deleteResult);
collection.insertOne(
{
name: '이름',
nickName: '닉네임',
},
(insertErr, insertResult) => {
if (insertErr) throw insertErr;
console.log('insertResult', insertResult);
client.close();
}
);
});
});
이렇게 만든 데이터베이스는 nodemon으로 해당 파일을 실행해준 뒤,
몽고db 아틀라스의 Browse Collections로 확인이 가능하다.
find([{ 조건들 }])
조건에 부합하는 데이터(Document)를 가져다 준다.
바로 데이터를 저장하는 것이 아니라 해당 데이터의 위치를 알려주는 cursor 형태로 가져온다.
그 커서를 배열로 바꿔준 다음 매개변수로 err 와 data를 넣어서 처리해준다.
data에 조건에 부합하는 데이터들이 담긴다.
const findCursor = collection.find({});
findCursor.toArray((err, data) => {
console.log(data);
});
'학원에서 배운 것 > DBMS MongoDB' 카테고리의 다른 글
KDT 5th 웹개발자 입문 수업 34일차 - 1 (0) | 2023.03.23 |
---|---|
KDT 5th 웹개발자 입문 수업 32일차 (0) | 2023.03.21 |