몽고DB는 아래와같이 구성됩니다.
Database , Collection, Document
데이터베이스는 컬렉션의 물리적 컨테이너 입니다. 하나의 데이터베이스에는 보통 여러개의 컬렉션을 가지고 있습니다.
컬렉션은 몽고DB Document 의 그룹이며 RDBMS 의 예를 들면 Table 과 개념과 유사합니다. 컬렉션은 단일 데이터베이스에 존재합니다. 컬렉션은 스키마를 강요하지 않습니다. 따라서 컬렉션 내부의 도큐먼트는 서로 다른 필드를 가질수 있습니다. 컬렉션 안에 도큐먼트는 일반적으로 서로 유사한 하거나 관련된 목적이 있습니다.
Docuemtn 는 하나의 키(key) 와 값(value)의 집합으로 이루어져 있으며 동적 스키마 입니다. 동적 스키마는 동일한 컬랙션 내의 도큐먼트가 동일한 필드 또는 구조를 가지필요 없을을 의미한다. 그리고 동일한 필드안에 다른타입의 데이터를 보유할수 있음을 의미합니다.
SQL의 table이 mongoDB의 collection, SQL의 tuple/row가 mongoDB의 Document에 해당된다.(개념적으로)
create
db.document.save({})
ObjectId로 관계 형성
read
db.document.find({})
sequelize에서 findeAll과 같음, 모두 조회
db.document.findOne({})
sequelize에서 findeOne과 같음, 하나만 조회
db.document.find({}, {_di: 0, name:1})
2번째 인수를 생성하고 조건을 넣는다. 0은 조회에서 제외 1은 포함이바.
id는 기본적으로 1이라서 제외시켜야한다. 비교연산자는 $gt와 같이 $로 표현한다.( sequelize은 op.gt )
db.document.update({name:'fdsa09876'}, $set: {comment: '필드 업데이트'})
첫 번째 인수는 변경 대상, 두 번째 인수는 $set를 포함해서 변경하고자하는 데이터를 넣는다. $set를 쓰지 않으면 전체가 replacement됨
db.document명.remove({name: "fdsa09876"})
첫 인자에 조건을 넣는다.
mongod --auth 접속 후
mongo admin -u root -p//password 접속
sql의 join을 사용할 수 있다. object document mapping으로 객체와 다큐먼트를 1대1 매핑시켜준다. 시퀄라이즈처럼 데이터베이스의 기능을 보완해준다.
npm i mongoose
MongoDB의 경우 Document에 잘못된 타입형이나 오타가 발생해도 에러가 발생하지 않는다. 장점이면서 단점으로 작용합니다. Mongoose에는 Schema라는 개념이 존재합니다. SQL언어처럼 테이블에 정해진 데이터만 입력될 수 있게 강제합니다.
schemas: Document의 구조를 schema형태로 정의하고 관리할 디렉토리 입니다.
routes : 라우터가 위치할 디렉토리입니다.
schemas/user.js
const mongoose = require('mongoose');
const { Schema } = mongoose; //구조파괴문법
const userSchema = new Schema({
name: {
type: String,
required: true,
unique: true,
},
married: {
type: Boolean,
required: true,
},
comment: String,
createdAt: {
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('User', userSchema);
// model의 첫번째 인수는 콜렉션이다.
몽구스의 join 기능은 다음과 같이 사용한다.
const mongoose = require('mongoose');
const { Schema } = mongoose;
const { Types: { ObjectId } } = Schema;
const commentSchema = new Schema({
commenter: {
type: ObjectId,
required: true,
ref: 'User',
},
comment: {
type: String,
required: true,
},
createdAt: {
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('Comment', commentSchema);
objectId를 스키마로부터 꺼내서 선언하고 ref로 외부 스키마를 지정한다. 몽구스의 CRUD도 mongoDB의 CRUD와 비슷합니다. mongoDB의 save는 몽구스에서 create로 사용합니다. 한 번 집고 넘어갈 점은 Update 입니다.
const result = await Comment.update({
// 조건
}, {
// 변경 데이터
});
//시퀄라이즈와 반대여서 헷갈리기 쉽다.
username: {
type: String,
required: true,
},
createdAt: {
type: Date,
default: Date.now,
},
Number 자료형은 실수형도 포함된다. double과 float를 따로 사용하지 않는다. createAt은 Date자료형으로 생성할 수도 있지만 timestamps을 설정해주면 자동으로 생성된다. 단점은 시간이 한국의 시간이 아니라는 점이다. 따라서 시간을 따로 손봐야한다.
const userSchema = new Schema({
username: {
type: String,
required: true,
}
},{
timestamps: true
})