Mongoose 모듈 (mongodb와 혼용, 연결, 스키마, 타입, 모델, CRUD)
참조문서 : http://mongoosejs.com/docs/guide.html
Mongoose는 MongoDB의 ODM(Object Data Mapping)으로 nodejs 모듈이다. ODM은 데이터베이스와 객체지향 프로그래밍 언어 사이 호환되지 않는 데이터를 변환하는 프로그래밍 기법을 말한다. 여기서는 4.11버전을 사용중이다.
npm install mongoose 로 설치한다.
1. mongodb VS mongoose
자바로 생각하면 mongodb모듈은 JDBC드라이버고, mongoose는 Hibernate나 Mybatis같은 개념같다. 속도가 예민하다면 mongodb모듈을 쓰라고 말하고 있다.
기본적으로 mongoose도 mongodb 모듈 위에서 동작하므로, mongodb의 모든 것을 사용할 수 있다.
2. 4.11 버전 이슈
몽구스 promise 사용을 선택할 수 있는데, mongoose.Promise = require('bluebird'); 꺼를 써도되고, ES6의 전역객체의 promise를 써도된다. 그럴라면 mongoose.Promise = global.Promise; 해줘야한다.
connect() 함수에 useMongoClient 파라미터가 추가되었다. 이거 안쓰면 deprecated 뭐라 그런다. 이외에 여기에 들어있던 server/replset/mongos 등이 모두 deprecated되었다.
3. DB 연결
mongoose.connect(uri[, options, callback]); 로 접속한다.
uri는 mongodb://${host}:${port}/${database명} 으로 구성된다. 보통 포트는 27017인 것 같다.
options 객체에는 아래와 같이 들어간다.
const options = {
useMongoClient: true
}
만약 커넥션객체를 얻고 싶다면 callback의 두번째 인자에 db를 주면된다. 이 db에는 mongodb 모듈의 NativeConnection 객체가 들어간다. 이 객체를 이용해 mongoose모듈이 아닌 mongodb 모듈처럼 이용할 수 있다. (혼용해서 이용해야 한다면..)
4. 스키마
MongoDB에는 완전 스키마가 없는 게 아니라 스키마로 부터 자유로운 정도다. 여기서 mongoose는 데이터 유효성 검증을 위해 스키마라는 개념을 쓴다.(validator) 모델 객체에 들어갈 데이타 형뿐 아니라, 데이타의 규약등을 지정할 수 있는 기능인데, 예를 들어 문자열의 길이나, 특수문자 지원 여부등을 검증할 수 있다. (해당 예제는 조대협님 블로그가 출처이다.)
function NameAlphabeticValidator(val) {
return val.match("^[a-zA-Z\(\)]+$");
}
function StringLengthValidator(val) {
if(val.length>10)
return null;
return val;
}
var userSchema = mongoose.Schema({
userid: {
type : String,
validate : NameAlphabeticValidator
},
age : Number,
city : {
type : String,
validate: [{
validator : NameAlphabeticValidator,
msg : 'city should be alphabet only'
},
{
validator : StringLengthValidator,
msg : 'city length should be less than 10'
}]
}
});
4-1. Default
데이터 값을 입력하지 않으면 default로 값을 넣을 수 있다.
var defaultSchema = new mongoose.Schema({
name : {
type : String,
default : 'Hello Terry'
},
published_date: {
type: Date,
default: Date.now
}
});
4-2. 타입
스키마에 사용되는 타입은 8가지가 있다.
- String : 문자열
- Number : 정수
- Date : 날짜
- Buffer : 2진데이터
- Boolean : 참거짓
- Schema.Types.Mixed : 다양한 타입, 타입없다고 봐도 된다
- Schema.Types.ObjectId : 명시적으로 _id를 나타낼때 쓴다. 안써도 자동생성
- Array : 배열
5. Model
model은 데이터베이스에서 데이터를 읽고 생성하고 수정하는 인터페이스를 정의해준다. var Book = mongoose.model('book', bookSchema); 이런식으로 생성한다. 컬렉션이름을 지정하지 않으면 보통 1번째 인자에 s를 붙여 복수형으로 사용한다.
var student = mongoose.Schema({
name : 'string',
address : 'string',
age : 'number'
}, {
collection : 'good', // 컬렉션명 지정
versionKey : false // "__v" 필드 생성X
strict : false
});
- 임의로 컬렉션명을 지정하고 싶다면 collection : '컬렉션명'
- 버전키를 안보이게하고싶으면 versionKey : false
- 스키마를 사용하지 않으려면 strict : false
6. CRUD
몽고 쉘 명령어와 비슷한듯 하다.
6-1. 생성 : .save
6-2. 조회 : .find
6-3. 제거 : .remove
출처: https://sjh836.tistory.com/104?category=710138 [빨간색코딩]
'JavaScript BackEnd > Node.js, Express' 카테고리의 다른 글
nodejs의 내부 동작 원리 (libuv, 이벤트루프, 워커쓰레드, 비동기) (0) | 2021.03.18 |
---|---|
V8 inspector을 이용한 디버깅 (0) | 2021.03.18 |
nodejs 메모리 누수 (0) | 2021.03.18 |
mongoose-auto-increment (0) | 2021.03.18 |
libuv (개념, 아키텍처, 이벤트루프, 쓰레드풀) (0) | 2021.03.18 |
워커 쓰레드풀 확장을 통한 성능튜닝 (process.env.UV_THREADPOOL_SIZE) (0) | 2021.03.18 |
request 모듈 (0) | 2021.03.18 |
Restify 모듈 (0) | 2021.03.18 |