mongoose ?
Mongoose는 MongoDB 기반 ODM(Object Data Mapping) Library입니다.
따라서 Javascript(TypeScript) 와 MongoDB 에 있는 데이터를 Mapping 하여 CRUD을 진행을 할수가 있습니다.
Install
$ npm install mongoose
(typescript 사용시)
$ npm install @types/mongoose
Connection
Connection 했을 때 관련된 정보들은 보통 환경변수(dotenv)를 통해서 관리합니다.
import * as mongoose from 'mongoose';
import config from '../env/index';
interface IConnectOptions {
autoReconnect: boolean;
reconnectTries: number; // Never stop trying to reconnect
reconnectInterval: number;
loggerLevel ? : string;
useNewUrlParser ? : boolean;
}
/**
* @constant {IConnectOptions}
*/
const connectOptions: IConnectOptions = {
autoReconnect: true,
reconnectTries: Number.MAX_VALUE,
reconnectInterval: 1000,
useNewUrlParser : true
};
/**
* @exports
* DB 설정 초기화
*/
export function init() {
mongoose.set('useCreateIndex', true)
const MONGO_URI: string = `${config.database.MONGODB_URI}${config.database.MONGODB_DB_MAIN}`;
// ex) mongodb://localhost/<db-name>
mongoose.connect(MONGO_URI, connectOptions);
// handlers
mongoose.connection.on('connecting', () => {
console.log('\x1b[32m', 'MongoDB :: connecting');
});
mongoose.connection.on('error', (error) => {
console.log('\x1b[31m', `MongoDB :: connection ${error}`);
mongoose.disconnect();
});
mongoose.connection.on('connected', () => {
console.log('\x1b[32m', 'MongoDB :: connected');
});
mongoose.connection.once('open', () => {
console.log('\x1b[32m', 'MongoDB :: connection opened');
});
mongoose.connection.on('reconnected', () => {
console.log('\x1b[33m"', 'MongoDB :: reconnected');
});
mongoose.connection.on('reconnectFailed', () => {
console.log('\x1b[31m', 'MongoDB :: reconnectFailed');
});
mongoose.connection.on('disconnected', () => {
console.log('\x1b[31m', 'MongoDB :: disconnected');
});
mongoose.connection.on('fullsetup', () => {
console.log('\x1b[33m"', 'MongoDB :: reconnecting... %d');
});
}
Schema & Model
MongoDB 자체에서는 원래는 Schema가 존재하지 않습니다.
따라서 장점도 있지만 명시적인 구조가 없기 때문에 어떤 데이터 타입인지 알기 어려운 단점이 존재합니다.
Mongoose는 그래서 Schema를 사용을 합니다.
Mongoose에 Schema는 MongoDB에 저장되는 데이터의 구조 , 타입에 관련된 정보를 JSON 형태로 정의할수가 있습니다. (RDBMS 테이블 정보와 비슷합니다.)
import * as mongoose from 'mongoose';
import { Document, Schema } from 'mongoose';
export interface IChatModel extends Document {
message : string // 채팅 메시지
}
/**
* @swagger
* components:
* schemas:
* ChatSchema:
* required:
* - message
* properties:
* message:
* type: string
*/
const ChatSchema: Schema = new Schema({
message : {type : String , required : true}
}, {
collection: 'chatmodel',
versionKey: false
})
ChatSchema.set('toObject', {
transform: (doc : any, ret : any) => {
delete ret._id;
return ret;
},
});
export default mongoose.model<IChatModel>('ChatModel', ChatSchema);
따라서 위와 같이 사용이 가능합니다.
Mongoose Schema 타입은 다음과 같이 제공을 합니다.
Data Type |
Description |
String |
표준 자바스크립트와 Node.js의 문자열 type |
Number |
표준 자바스크립트와 Node.js의 숫자 type |
Boolean |
표준 자바스크립트와 Node.js의 불리언 type |
Buffer |
Node.js의 binary type(이미지, PDF, 아카이브 등) |
Date |
ISODate format data type(2016-08-08T12:52:30:009Z) |
Array |
표준 자바스크립트와 Node.js의 배열 type |
Schema.types.ObjectId |
12byte binary 숫자에 대한 MongoDB 24자리 hex 문자열(501d86090d371bab2c0341c5) |
Schema.types.Mixed |
모든 유형의 데이터 |
Mongoose는 기본적으로 primary-key인 _id을 자동으로 제공을 합니다.
따라서 저 같은 경우에는 가져올때 _id를 제거 하기 위해서 toObject() 라는 함수를 통해서 _id를 제거를 합니다.
그리고 마지막줄 같은 경우에는 model을 생성합니다.
collection에 이름을 명시적으로 지정하지 않을 경우에는 첫번째 인자의 이름으로 생성이 됩니다.
사용법
따라서 위와 같이 만든 Model를 사용을 아래와 같이 할수가 있습니다.
SAVE
import ChatModel from './model'
let model : IChatModel = new ChatModel({
message : ""
})
const saved: IChatModel = await model.save();
GET
import ChatModel from './model'
ChatModel
.find()
.skip(offset * limit).limit(limit)
.where(Parameter.ROOM_ID)
.equals(roomId))
UPDATE
import ChatModel from './model'
ChatModel
.updateOne({조건} , {$set : {
message : "message"
}})
DELETE
import ChatModel from './model'
ChatModel
.findOneAndRemove({
id: Types.ObjectId(id)
});
이렇게 Mongoose 기본 사용법에 대해서 설명하였습니다.
다음에는 더 자세한 내용으로 하나하나씩 살펴보도록 하겠습니다.