[ Node.js ] Mongoose 를 사용해보자!

Shin·2022년 2월 28일
4

JS

목록 보기
8/8

🤷‍♂️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 이기 때문에 프로미스를 이용하듯이 이용할수 있습니다.

  1. 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 부분에 typeSchema.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
누군가의 선택지가 될 수 있는 사람이 되자

0개의 댓글