SoShin_
์†Œ์‹ 
SoShin_
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • Study
      • HTML | CSS
      • JavaScript
      • Django
      • Python
      • Flask
      • Git
      • Project
      • ์ด๊ฒƒ์ €๊ฒƒ
      • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
      • NestJS
    • Review
      • Book
      • Movie & Drama

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์˜ํ™”๋ฆฌ๋ทฐ
  • ์œ ์ €๊ธฐ๋Šฅ
  • ์œ„๋„๊ฒฝ๋„
  • FLASK
  • KakaoAPI
  • db
  • ๋ฌธ์ œํ’€์ด
  • ์˜ํ™”์ถ”์ฒœ
  • allauth
  • Django allauth
  • MongoDB
  • js
  • orm
  • ์žฅ๊ณ  ์œ ์ €๊ธฐ๋Šฅ
  • Python
  • openpyxl
  • Django ์œ ํšจ์„ฑ ๊ฒ€์ฆ
  • node.js
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • JavaScript
  • ์žฅ๊ณ 
  • flask orm
  • SQLAlchemy
  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
  • SQLite
  • ์žฅ๊ณ  ์ œ๋„ค๋ฆญ๋ทฐ
  • ํ”Œ๋ผ์Šคํฌ
  • ํŒŒ์ด์ฌ
  • Django
  • ์žฅ๊ณ  allauth

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
SoShin_

์†Œ์‹ 

Study/JavaScript

[ Node.js ] Mongoose ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž!

2022. 3. 13. 15:56
๋ฐ˜์‘ํ˜•

๐Ÿคทโ€โ™‚๏ธ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)
  })

> #### ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’ ํ•˜๋‚˜๋งŒ ์ฐพ๊ธฐ
```js
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)

>```js
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
}

๋ฐ˜์‘ํ˜•

'Study > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ Node.js ] crypto๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ•˜๊ธฐ  (0) 2022.02.24
[ Node.js ] readFile, readFileSync ํ•จ์ˆ˜ ์•Œ์•„๋ณด๊ธฐ  (0) 2022.02.20
[ JS ] Event ์ •๋ฆฌ  (0) 2022.02.08
[ JS ] DOM์— ๋Œ€ํ•œ ์ด ์ •๋ฆฌ!  (0) 2022.02.08
[ JS ] JS์˜ TDZ๋ž€ ๋ฌด์—‡์ผ๊นŒ?  (0) 2022.02.08
    'Study/JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [ Node.js ] crypto๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ•˜๊ธฐ
    • [ Node.js ] readFile, readFileSync ํ•จ์ˆ˜ ์•Œ์•„๋ณด๊ธฐ
    • [ JS ] Event ์ •๋ฆฌ
    • [ JS ] DOM์— ๋Œ€ํ•œ ์ด ์ •๋ฆฌ!
    SoShin_
    SoShin_
    ์ง์ ‘ ์“ฐ๋Š” ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”