포시코딩

[Mongoose] Schema.virtual을 통해 ObjectId(_id) 다루기 본문

MongoDB

[Mongoose] Schema.virtual을 통해 ObjectId(_id) 다루기

포시 2022. 12. 12. 19:56
728x90

Schema.virtual이란?

mongoose 라이브러리에서는 MongoDB 내부에는 특정 Column이 존재하지 않지만, 

데이터를 조회할 때 가상의 Column을 추가하여 좀 더 편리하게 데이터를 가공하거나 사용할 수 있도록 도와준다.

 

Schema.set('toJSON', { virtuals: true })JSON 타입으로

해당 Schema를 변환할 때 가상값인 todoId를 반환하도록 설정하는 것이다.

 

Studio 3T와 mongoose의 데이터를 비교해보았을 때, 

virtual로 등록된 todoId 값이 MongoDB에는 존재하지 않지만,

mongoose를 이용해 조회하였을 때는 값이 존재하는 것을 확인할 수 있다.

 

여기서 virtual로 설정한 todoIdreturn this._id; 를 이용해 _id

즉, Todo Schema의 ObjectId를 반환하는 것으로 확인할 수 있다.

 

정리하자면 Schema.virtual을 통해 만든 todoId는

express 서버 내부에서만 보여주는 가상의 column인 것이다.

 

Studio 3T에서 조회한 실제 데이터
mongoose에서 조회한 데이터

 

사용예시

(models/todo.js)
const mongoose = require('mongoose');

const TodoSchema = new mongoose.Schema({
  value: String, // 할 일이 어떤것인지
  doneAt: Date,   // 할 일이 언제 완료되었는지
  order: Number,  // 몇 번째 할 일인지
});

TodoSchema.virtual('todoId').get(function() {  // this를 써야하기 때문에 arrow f이 아닌 function 을 썼다.
  return this._id.toHexString();
}); 
// _id의 경우 toHexString() 처리를 해줘야 에러가 없다고들 한다.

TodoSchema.set('toJSON', { virtuals: true })
// 아래에 해당하는 model을 바탕으로 데이터를 생성, 조회 등을 할 때 
// 위에서 지정한 todoId를 JSON 타입으로 변경할 때 보여준다. 라는 의미

module.exports = mongoose.model('Todo', TodoSchema);

 

 

[링크](Mongoose의 virtual 문법 자세히 보기)

 

Mongoose v6.8.0: Schemas

If you haven't yet done so, please take a minute to read the quickstart to get an idea of how Mongoose works. If you are migrating from 5.x to 6.x please take a moment to read the migration guide. Everything in Mongoose starts with a Schema. Each schema ma

mongoosejs.com

728x90