TIL. 54 mongoose

조윤식·2022년 9월 8일
0

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);
});

1. const mongoose = require('mongoose`) 를 통해 mongoose 모듈을 불러옵니다.

2. 그 후 mongoose.connetc("데이터 베이스 주소") 를 통해 MongoDB와 연결할 수 있습니다.

- 이때 Mongoose query는 then() 함수를 가진 thenable 이기 때문에 프로미스를 이용하듯이 이용할수 있습니다.

then 을 통해 연결에 성공 했을 때와 실패 했을때를 구분해서 메세지를 출력할 수 있습니다.

- 모델 정의하기 [ 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)

1. mongoose를 불러온 후, mongoose 안의 Schema를 가져온다.

2. 그 후 new Schema를 통해 Schema를 구성해 준다.

3. 그 후 생성해준 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
}

profile
Slow and steady wins the race

0개의 댓글