Node.js와 MongoDB를 위한 ODM(Object Data Mapping) 라이브러리
ODM을 활용하면 프로그래밍 언어 Object와 MongoDB의 데이터를 Mapping하여 호환성을 만들어내고, 간편한 CRUD 가능
ODM
- ODM(Object Data Mapping)은 객체와 문서의 1대1 매칭
Object는 자바스크립트의 객체, Document는 MongoDB의 문서- 즉, 문서를 DB에서 조회할 때 자바스크립트 객체로 바꿔주는 역할
장점
스키마와 모델을 만드는 것을 통하여 data를 불러온 후에 그 데이터를 객체화시키는 것이 빠름
그 객체를 수정함으로써 데이터에 수정할 수 있음.
또한 분명하게 모델링된 문서(Document)들이 모여있는 Collection을 관리하는 것도 수월.
$ npm i mongoose
// mongoDB를 node.js에서 사용할 수 있도록 만든 것이 mongoose 모듈
const mongoose = require("mongoose");
// strictQuery Error 해결
mongoose.set("strictQuery", true);
mongoose
.connect("mongodb://localhost:27017/movieApp")
.then(() => {
console.log("Connection Open");
})
.catch((e) => {
console.log("ERROR");
console.log(e);
});
});
Mongoose 버전이 6.0 이상이면 useNewUrlParser, useUnifiedTopology, useFindAndModify 및 useCreateIndex는 더 이상 지원되지 않는 옵션
Mongoose 버전 6.0 이상부터는 기본적으로 useNewUrlParser, useUnifiedTopology, useFindAndModify가 true, useCreateIndex가 false로 동작
mongoose.connect()
기본 포트 (27017)에서 로컬로 실행 되는 myapp 데이터베이스 를 연결하는 데 필요한 최소값 입니다. 컴퓨터에서 연결에 실패하면 localhost 대신 127.0.0.1 을 사용
strictQuery Error : Automattic
mongoose.Schema
객체를 인스턴스화하여 스키마 값을 객체 형식으로 필드의 이름과 타입을 순서로 스키마를 정의const { Schema } = mongoose;
const PostSchema = new Schema({
title: String,
body: String,
tags: [String], // 문자열 배열
publishedDate: {
type: Date,
default: Date.now // 현재 날짜를 기본값으로 지정
})
String
: 문자열Number
: 숫자Date
: 날짜Buffer
: 파일을 담을 수 있는 버퍼Boolean
: treu or falseMixed
(Schema.Types.Mixed) : 어떤 데이터도 넣을 수 있는 형식ObjectId
(Schema.Types.ObjectId) : 객체 아이디, 주로 다른 객체를 참조할 때 넣음Array
: 배열 형태의 값, []로 감싸서 사용String
lowercase
: boolean, whether to always call .toLowerCase() on the valueuppercase
: boolean, whether to always call .toUpperCase() on the valuetrim
: boolean, whether to always call .trim() on the valuematch
: RegExp, creates a validator that checks if the value matches the given regular expressionenum
: Array, creates a validator that checks if the value is in the given array.minLength
: Number, creates a validator that checks if the value length is not less than the given numbermaxLength
: Number, creates a validator that checks if the value length is not greater than the given numberpopulate
: Object, sets default populate optionsNumber
min
: Number, creates a validator that checks if the value is greater than or equal to the given minimum.max
: Number, creates a validator that checks if the value is less than or equal to the given maximum.enum
: Array, creates a validator that checks if the value is strictly equal to one of the values in the given array.populate
: Object, sets default populate optionsDate
min
: Date, creates a validator that checks if the value is greater than or equal to the given minimum.max
: Date, creates a validator that checks if the value is less than or equal to the given maximum.expires
: Number or String, creates a TTL index with the value expressed in seconds.ObjectId
populate
: Object, sets default populate optionsrequired
: (boolean or function) 값이 true이면 꼭 입력해야 한다.default
: (Any or function) 값이 true이면 문서가 생성되면 기본값으로 저장됩니다.select
: (boolean) 쿼리에 대한 기본 투영을 지정합니다.validate
: 함수로 개발자가 조건을 만듭니다.set
: 값을 입력할 때 함수로 조건을 만듭니다.get
: 값을 출력할 때 함수로 조건을 만듭니다.alias
: (string) 지정된 이름으로 이 경로를 가져오거나 설정하는 가상을 정의합니다.immutable
: (boolean) 경로를 불변으로 정의합니다. Mongoose는 상위 문서에 "isNew: true"가 없는 한 변경할 수 없는 경로를 방지합니다transform
: (function) 몽구스는 JSON.stringify() 문서를 포함하여 "Document# to JSON()" 함수를 호출할 때 이 함수를 호출합니다.index
: (boolean) 이 속성에 인덱스를 정의할지 여부를 지정합니다.unique
: (boolean) 이 속성에 unique
인덱스를 정의할지 여부를 지정합니다.sparse
: (boolean) 이 속성에 sparse
인덱스를 정의할지 여부를 지정합니다.스키마를 사용하여 만드는 인스턴스로, 데이터베이스에서 실제 작업을 처리할 수 있는 함수들을 지니고 있는 객체
모델을 만들 때는 mongoose.model 함수를 사용한다.
model()
함수는 두 개의 파라미터를 필요로 한다.
첫 번째 파라미터는 스키마 이름이고, 두 번째 파라미터는 스키마 객체이다.
데이터베이스는 스키마 이름을 정해주면 그 이름의 복수 형태로 데이터베이스에 컬렉션 이름을 만든다.(스키마 이름이 'Post'이면 컬렉션은 'posts'로 생성)
MongoDB에서 컬렉션 이름을 만들 때, 권장되는 컨벤션은 구분자를 사용하지 않고 복수 형태로 사용하는 것이다.
컨벤션 규칙을 따르고 싶지 않다면, model()
함수의 세 번째 파라미터에 원하는 컬렉션 이름을 넣으면 된다.
const mongoose from 'mongoose';
const { Schema } = mongoose;
// 스키마 객체 생성
const PostSchema = new Schema({
title: String,
body: String,
tags: [String], // 문자열 배열
publishedDate: {
type: Date,
default: Date.now // 현재 날짜를 기본값으로 지정
})
// 모델 생성
const Post = mongoose.model('Post', PostSchema);
const post1 = new Post({
title : "Post1",
body : "Body",
tag : ["tag1","tag2"]
// 날짜를 입력하지 않으면 현재 날짜가 기본값
})