충청 ICT이노베이션스퀘어 Web Programming & AI 온라인 교육중 MongoDB 내용을 듣고 정리한 글입니다.
Mongoose ODM(Object Data Modeling)은 MongoDB의 Collection에 집중하여 관리하도록 도와주는 Node.js 패키지
Mongoose ODM을 사용함에 있어 가장 먼저 해줘야 될것은 스키마를 정의 해줘야 한다. 내가 원하는 데이터의 형식을 미리 여러개 만들어 둔 다음 DB를 사용할때 데이터 형식을 체크해주는 기능을 제공한다
const { Schema } = require('mongoose');
const PostSchema = new Schema({ # 원하는 이름
title: String, #원하는 데이터 와 타입
content: String,
}, {
timestamps: true, # 옵션
});
module.export = PostSchema; # 모듈화
new Schema를 사용시 첫번째는 원하는 데이터와 그 데이터의 타입을 지정해줄 수 있고, 그 다음 데이터로는 옵션을 줄 수 있다. 옵션으로는 고유 _id를 해제 할 수 있는 id 옵션과, createdAt, updatedAt 필드를 자동으로 생성해주는 timestamps 옵션, 특정 바이트 이상 저장 되었을 경우 오래된 데이터를 자동으로 삭제하는 capped 옵션 등이 있다.
스카마를 정의 했으면 해당 스키마를 mongoose에서 사용할 수 있는 모델로 작성해야 한다
const PostSchema = require('./schemas/board'); #정의된 스키마
exports.Post = mongoose.model('Post', PostSchema);
mogoose.model 함수를 통해 모델을 만듦, 첫번째 인자로는 모델 이름을 지정해주고 두번째 인자로는 정의된 schema를 넣어줘야 한다
모델을 작성했으면 MongoDB와 연결을 해야 한다. mongoose는 자동으로 연결을 관리해 주어 직접 연결 상태를 체크하지 않아도 모델 사용시 연결 상태를 확인하여 사용 가능할때 작업한다.
mongoose.connect('mongodb://localhost:27017/test');
mongoose.connect를 사용하여 간단하게 연결 할 수 있다.
데이터베이스에 성공적으로 연결이 되었다면 작성된 모델을 사용하여 CRUD를 수행할 수 있다.
async function main() {
const created = await Post.create({
title: 'first title',
content: 'second title',
});
const multpleCreated = await Post.create([
item1,
item2
]);
}
create 함수를 사용하여 document 생성이 가능하며, 배열을 넣어 여러개의 document들을 생성할 수도 있다. 정의된 스키마 구조를 벗어나는 데이터들은 저장이 되지 않으며 데이터를 비워둘 경우 비워진 채로 저장이 된다.
async function main() {
const listPost = await Post.find(query); #전부
const onePost = await Post.findOne(query); # 1개만
const postById = await Post.findById(id); # ObjectID로 검색
}
find와 findOne함수는 query를 작성하여 DataBase를 검색하는데 query는 { key:value }로 작성이 가능하다. 또한 lte(<=),gte(>=)를 사용하여 range query 작성이 가능하며 $in으로 다중 값으로 검색, $or을 사용하여 다중 조건 검색이 가능하다.
async function main() {
const updateResult = await Post.updateOne(query, {
...
});
const updateResults = await Post.updateMany(query, {
...
});
const postById = await Post.findByIdAndUpdate(id, {
...
});
const onePost = await Post.findOneAndUpdate(query, {
...
});
}
updateOne함수는 첫번째 매칭이 되는 Document만 수정하고 updateMany함수는 모든 Document들을 수정한다. 해당 함수의 인자로는 첫번째에 내가 찾고자하는 Document의 조건을 입력하고, 두번째에는 바꿀 데이터를 입력한다. 앞에 find~ 함수들은 검색된 Document를 업데이트 후에 해당 Document를 반환 한다. 만약 찾는 문서가 없으면 null을 반환
async function main() {
const deleteResult = await Post.deleteOne(query);
const deleteResults = await Post.deleteMany(query);
const onePost = await Post.findOneAndDelete(query);
const postById = await Post.findByIdAndDelete(query);
}
DELETE도 UPDATE와 비슷한데 차이는 update는 수정을 하고 delete는 삭제를 한다. findByIdAndDelete 함수는 해당 _id에 따라 삭제된 Document를 반환하거나 없을 경우 null을 반환한다.
보통 models 디렉터리에 Schema들을 정의 해두는 Schema폴더와 Model을 같이 둔다. Schema 폴더 Schema들을 정의해두고 models폴더의 index.js 파일에 model을 선언후 app.js 파일에 mongoose.connect를 작성한다.