🤷♂️Mongoose란 무엇일까?
- Mongoose 모듈은 MongoDB 라는 NoSQL 데이터베이스를 Node.js로 사용할 수 있도록 하는 확장 모듈 중 하나 입니다.
- Mongoose는 데이터를 만들고 관리하기 위해 스키마 [ Schema ]를 만들고, 그 스키마로 모델을 만들어 데이터를 관리 합니다.
- 스키마와 모델을 통하여 data를 불러온 후 객체화 시켜 빠르게 수정함으로써 데이터에 접근 가능하게 만들어줍니다.
- 모델링 된 문서 [ Document ]가 모여있는 Collection을 관리하는 것을 수월하게 만들어 줍니다.
🍀 주요 메소드 사용해보기
💻데이터 베이스 연결하기
const mongoose = require('mongoose')
mongoose.connect("mongodb://127.0.0.1:27017/UserAPI")
.then(() => {
console.log("Connected to MongoDB => UserAPI");
})
.catch((err) => {
console.log(err);
});
const mongoose = require('mongoose`)
를 통해 mongoose 모듈을 불러옵니다.mongoose.connetc("데이터 베이스 주소")
를 통해 MongoDB와 연결할 수 있습니다.💡 이때 Mongoose query는 then() 함수를 가진 thenable 이기 때문에 프로미스를 이용하듯이 이용할수 있습니다.
🎫 모델 정의하기 [ Schema 만들기 ]
const mongoose = require('mongoose')
const {Schema} = require('mongoose')
const UserSchema = new Schema({
user_id: {
required: true,
unique: true,
type: String,
},
password: {
required: true,
type: String,
},
salt: {
required: true,
type: String,
},
email: {
required: true,
type: String,
unique: true,
}
})
mongoose.model('users', UserSchema)
new Schema
를 통해 Schema를 구성해 준다.mongoose.model('모델명', 사용할 스키마)
를 통해 모델을 생성해줍니다.🔍 검색하기!
조건에 맞는 모든 값을 찾기
userModel.find({user_id: 'admin'}).then((docs) => { console.log(docs) })
또는
userModel.find({user_id: 'admin'}, (err,docs) => { console.log(docs) })
조건에 맞는 값 하나만 찾기
userModel.findOne({user_id: 'admin'}).then((docs) => { console.log(docs) })
id 값으로 검색하기
userModel.findById("621b574ff0bfe6d32b330505").then((docs) => { console.log(docs) })
💾 도큐먼트 추가 ( 값 저장 )
모델 인스턴스 생성 후 추가하기
const userInfo = { user_id: req.body.user_id, salt: salt, password: hash.cryptoPassword(req.body.password, salt), email: req.body.email, } const newUser = await new userModel(userInfo) newUser.save((err) => { if (err) { console.log("POST : 유저 생성 실패") return res.status(500).json({ message: `create failed: ${err}` }) } console.log(newUser) res.status(200).json({ message: "create succeed" }) })
모델 인스턴스를 생성하지 않고 모델을 이용하여 추가하기
const userInfo = { user_id: req.body.user_id, salt: salt, password: hash.cryptoPassword(req.body.password, salt), email: req.body.email, } userModel.create(userInfo, (err) => { if (err) { console.log("POST : 유저 생성 실패") return res.status(500).json({ message: `create failed: ${err}` }) } console.log(userInfo) res.status(200).json({ message: "create succeed" }) })
🗑 도큐먼트 제거 ( 삭제 )
const post = await postModel.findOne({title: req.params.title}) if (!post) { console.log("삭제할 게시글이 없습니다. ") return res.status(500).json({message: "None Data"}) } postModel.deleteOne(post, (err) => { if (err) { return console.log(err); } console.log("삭제 성공") })
🛠 도큐먼트 수정 ( Update)
postModel.updateOne(post, updatePost, (err) => { if (err) { console.log(`포스트 수정 실패 => ${err}`) return res.status(500).json({message: "Update Failed"}) } console.log("포스트 수정 성공") res.status(200).json({ message: "Update Success", data: {updatePost} }) }
🧵 Mongoose Populate [ INNERJOIN ]
Schema 설정
const postSchema = new Schema({ title: { type: String, required: true, }, body: { type: String, required: true, }, author: { type: Schema.Types.ObjectId, ref: "users", index: true, required: true, }, time: { type: Date, default:getDate() } , })
위 코드의
author
부분에type
이Schema.Types.ObjectId
인 것을 볼 수 있습니다.
이건users
모델의id
를 가져오기 위한 타입 설정이며, 이를 위해ref
에 연결한 모델의 이름을 작성해줍니다.
populate 전 데이터
{ _id: "621b827c92b350447277a06e", title: "수정 테스트", body: "성공해람", author: "621b574ff0bfe6d32b330505", time: "2022-02-28T20:14:57.865Z", __v: 0 },
populate 하기 전 데이터를 확인해보면
author
안에ObjectId
타입으로 데이터가 들어가 있는 것을 확인할 수 있습니다.
이 데이터를 이제 사용할 수 있도록 펼치기 위해 populate를 사용하게 됩니다.
populate 하는 법
try { const user = await userModel.find({user_id: req.params.author}) postModel.find({author: user}).populate('author').then((post) => { res.status(200).json(post) }) } catch (e) { console.log(`검색 실패 => ${e}`) res.status(500).json({message: "search Failed"}) }
populate 사용 후 데이터 모습
{ _id: "621b827c92b350447277a06e", title: "수정 테스트", body: "성공해람", author: { _id: "621b574ff0bfe6d32b330505", user_id: "admin", password: "30b55922e2cd2752a859b4e2294b10cd47192c5c8f9174b39c4aaf28837d16de", salt: "b5676ff2b24934a33005986e88ce838fdba6197cdef40dfbf23fa40ad36ddafc", email: "test@example.ocm", __v: 0 }, time: "2022-02-28T20:14:57.865Z", __v: 0 }