node.js(수정기능)

GW·2024년 6월 26일

수정기능의 순서

1.글마다 있는 수정버튼 누르면 글수정할 수 있는 페이지로 이동

app.get('/edit/:id', (요청, 응답) => {
  응답.render('edit.ejs')
})
  1. 그 페이지엔 글의 제목과 내용이 이미 폼에 채워져있어야함
app.get('/edit/:id',async(req, res)=>{
    let result = await db.collection('post').findOne({_id : new ObjectId(req.params.id) })
    res.render('edit.ejs',{result:result})
})

(edit.ejs)

(생략)
<input name="title" value="<%= result.title %>">
<input name="title" value="<%= result.content %>">
  // value에 저렇게 데이터를 넣어줘야 view단에서 데이터가 나온다.
  1. 전송누르면 그걸로 기존에 있던 document를 수정해줌

유저가 어떻게 DB에 저장되는 ID를 알아서 데이터를 찾아줄까?
<input name="id" value="<%= result._id type= hidden%>">

  • id값을 미리 ejs파일에 저장시킨다.
app.post('/edit', async(req,res)=>{
    // try{
        let result = await db.collection('post').updateOne({_id : new ObjectId(req.body.id)},
                                                           {$set: {title: req.body.title,
                                                            content : req.body.content}})

method override

put,delete를 사용하는 방법 ajax를 사용하거나, method를 강제로 변경해주는 라이브러리를 사용한다.

method를 강제로 변경하는 라이브러리

  1. 터미널에서 npm install method-override를 입력
  2. 서버 상단에 코드입력
    const methodOverride = require('method-override')
    app.use(methodOverride('_method'))
  3. <form action="/edit?_method=PUT" method="POST"> </form>
  4. app.post('/edit', async(req,res)=>{ 가 아닌 put으로 변경

updateOne 추가 문법

db.collection('컬렉션명').updateOne(
  { _id : new ObjectId('수정할 document _id') },
  { $set: { like : 1 } }
) 
  • $set을 쓰면 기존값을 덮어쓰기 해준다.
db.collection('컬렉션명').updateOne(
  { _id : new ObjectId('수정할 document _id') },
  { $inc: { like : 1 } }
) 
  • $inc를 사용하면 숫자를 증감하거나 감소한다.
  • like :1 이면 1씩 증가 2면 2씩 -1 이면 -1씩 감소

$mul 쓰면 기존값에 곱셈

여러 document 동시 수정은 updateMany

db.collection('컬렉션명').updateMany(
      { title : '멍청아' },
      { $set: { title : '착한친구야' } }
)
  • 이렇게 코드짜면 이 컬렉션 안에 title이 '멍청아'로 되어있는 모든 document를 찾아서
    title 항목을 '착한친구야'로 덮어쓰기를 해준다.

조건에 맞는 것만 updateMany하기

db.collection('컬렉션명').updateMany(
  { like : { $gt: 5 } },
  { $set: { like : 100 } }
) 
  • 이렇게 작성하면 like 항목이 5보다 큰 document만 전부 필터링한 다음
    like 항목을 100으로 일괄 수정한다.
  • $gt 는 greater than의 약자라서 '초과'를 뜻
  • $gte 는 equal이 뒤에 붙었다고 생각하면 되어서 '이상'인걸 뜻
  • $lt 는 lesser than의 약자라서 '미만'을 뜻
  • $lte 는 이하
  • $ne 쓰면 not equal이라는 뜻이라 예를 들어 like가 10이 아닌 것만 필터링해서 수정할 수도 있다.

0개의 댓글