노드숙련강의 1-4

·2022년 12월 19일
0

study

목록 보기
7/81
post-thumbnail

Schema.virtual

mongoose 라이브러리에서는 MongoDB 내부에는 특정 Column이 존재하지 않지만, 데이터를 조회할 때 가상의 Column을 추가하여 좀 더 편리하게 데이터를 가공하거나 사용할 수 있도록 도와줍니다.

Schema.set(”toJSON”, {virtuals: true})JSON 타입으로 해당 Schema를 변환할 때 가상값인 todoId를 반환하도록 설정하는 것 입니다.

Studio 3Tmongoose의 데이터를 비교해보았을 때,
virtual로 등록된 todoId 값이 MongoDB에는 존재하지 않지만, mongoose를 이용해 조회하였을 때는 값이 존재하는것을 확인할 수 있습니다.

여기서 vitual로 설정한 todoIdreturn this._id; 를 이용해 _id 즉, Todo SchemaObjectId를 반환하는것으로 확인할 수 있습니다.

// models/todo.js

const mongoose = require("mongoose");

// mongoose schema생성
const TodoSchema = new mongoose.Schema({
  value: String, // 어떤 할 일?
  doneAt: Date, // 할 일이 언제 완료되었는지?
  order: Number, // 순서
});

//_id값을 todoId라는 가상의 컬럼으로 보여줄것
//mongoDB의 고유한값 => _id를 그대로 내보내면 문제가 발생할수도있음(toHexString())
TodoSchema.virtual("todoId").get(function () {
  return this._id.toHexString();
});

//어떤 타입으로 변경했을때 보여줄것인지
// => json타입으로 변경했을때 보여준다.
TodoSchema.set("toJSON", { virtuals: true });

//Todo라는 이름의 모델을 TodoSchema로 만들어 내보내겠다.
module.exports = mongoose.model("Todo", TodoSchema);

mongoose의 virtual 문법에 대해 자세히 알고싶다면 여기를 클릭하세요!

API

할 일 추가 API

// routes/todos.router.js

const Todo = require("./models/todo");

router.post("/todos", async (req, res) => {
  const { value } = req.body;
  const maxOrderByUserId = await Todo.findOne().sort("-order").exec();
  //sort("-order"): order값 역순으로 조회 => 젤 위에 있는거부터 조회(즉, 내림차순)
  //exec() : 여기까지 데이터조회를 하겠다.

  const order = maxOrderByUserId ? maxOrderByUserId.order + 1 : 1;
  //maxOrderByUserId 가 있을때 +1, 없다면 1생성
  const todo = new Todo({ value, order });
  await todo.save();
  res.send({ todo });
});
profile
개발자 꿈나무

0개의 댓글