MongoDB에서는 데이터를 생성할 때 id가 자동으로 나온다.
이 아이디를 이용해서 read를 구현하려면 findById라는 메서드를 이용한다.
{
title : "테스트 제목입니다.",
description : "테스트 내용입니다.",
creator : "u1"
}
이라는 데이터가 있고 이에 따른 스키마가 정의되어 있다고 가정한다.
이때 몽고디비에 저장하면
{
_id : "sglsnlkorink1n3l"
title : "테스트 제목입니다.",
description : "테스트 내용입니다.",
creator : "u1"
}
위에 처럼 _id
가 자동으로 난수로 생성이 된다.
이 id를 이용해서 데이터를 찾을 것이며 에러처리는 생략한다.
const TestData = require("스키마정의경로")
const getDataById = async(req, res, next) => {
const testId = req.params.id
let foundData
try{
foundData = await TestData.findById(testId)
} catch(err) {
에러 불러오는 함수
}
res.json({foundData : foundData.toObject({getters: true})})
}
위와 같다.
코드를 보면 testId
로 파라미터에서 아이디를 추출해내고
foundData라는 변수를 만들고 스키마인 TestData
와 동일한 스키마를 가진 내용을 db에서 가져와 placeID와 일치하는 아이디를 가진 데이터를 불러온다.
이때 응답값에서 toObject메서드는 몽고디비에서 생성되는 아이디를 자바스크립트에서 해석할 수 없기 때문에 붙혀주고 안에 있는 getters:true는 _id
가 보기 싫으니까 그냥 id로 만들어주기 위해 넣어 준 것이다.
조건은 가와 동일하며 데이터 내부의 creator를 이용해서 데이터를 검색해 볼 것이다.
const getDataByCreatorID = async(req, res, next) => {
const testId = req.params.id
let foundData
try{
foundData= await TestData.find({creator: testId})
} catch(err){
에러 불러오는 함수
}
res.json({foundData: foundData.map((data) => data.toObject({getters:true})})
}
가의 과정과 비슷한데 이 때는 find라는 메서드를 이용해서 찾아야 한다.
find 메서드는 스키마와 동일한 데이터를 find 내부의 파라미터를 이용해서 일치하는 데이터만 뽑아서 출력한다.
이때 응답값에 map을 이용하는 이유는 일치하는 데이터는 배열형태로 나오고 그 안에 _id
를 id
로 만들기 위해서 사용하는 것이다.
const update = (req, res, next) => {
const {title} = req.body;
const findId = req.params.pid
const updatedData = {...DUMMY_DATA.find((p) => p.id === findId))}
const index = DUMMY_DATA.findIndex((p) => p.id === findId))
updatedData.title = title
DUMMY_DATA[index] = updatedData
res.status(200).json({data : updatedData})
}
전에 작성한 함수를 재활용 할 것이다.
업데이트도 동일하게 id를 이용해서 업데이트 할 데이터 찾기 => 글작성(업데이트) => 저장이다
즉 find와 create를 합친것과 동일하다.
const update = async (req, res, next) => {
const {title} = req.body;
const findId = req.params.pid
let foundData
try{
foundData = await TestData.findById(findId)
} catch(err){에러 함수}
foundData.title = title
try{
await foundData.save()
} catch(err){에러 함수}
res.status(200).json({foundData: foundData.toObject({getters:true})})
}
마치 read와 create합친 것과 비슷하다
findById를 이용해서 데이터를 찾고 그 데이터를 save함수를 이용해서 덮어 씌워준다.
delete 역시 동일하다
데이터를 찾고 => remove메서드를 이용해서 지워주면 된다.
const delete = (req, res, next) => {
const findId = req.params.pid
DUMMY_DATA = DUMMY_DATA.filter((p) => p.id !== findId)
res.status(200).json({message : "삭제완료"})
}
이미 만들어진 코드를 수정해 보겠다.
const delete = async (req, res, next) => {
const findId = req.params.pid
let foundData
try{
foundData = await TestData.findById(findId)
}catch(err){에러 함수}
try{
await foundData.remove()
} catch(err){에러 함수}
res.status(200).json({message : "삭제완료"})
}