mongoose에서 가상 필드를 사용하지 않고 조회하는 방법을 공유하려고 합니다.
더 좋은 방법이 있다면 댓글로 알려주시면 감사하겠습니다.🙏
가상 필드 조회 안 하기
아래처럼 가상 필드를 사용하고 있다고 했을 때
postSchema.virtual('totalComments').get(function (this: IPost) {
return this.comments.length;
});
find(). select()로 가상 필드에서 사용하는 필드를 제외시키면 에러가 발생하게 됩니다.
"Cannot read properties of undefined (reading 'length')"
find 끝에 lean()을 붙여주면 MongoDB Document가 아닌 Javascript Object(Plain Old JavaScript Objects)로 조회하게 되면서 가상 필드를 사용하지 않게 됩니다. 👍
find().select(-comments).lean();
Mongoose Lean() 이란
우리가 사용하는 Mongoose 쿼리는 Javascript Object를 반환한다고 생각할 수 있지만 Mongoose Document를 반환합니다.
그 덕분에 캐스팅이나 save()를 사용할 수 있는 것이죠! 😄
lena()은 Mongoose Document가 아니라 바로 Javascript Object로 쿼리 하는 옵션입니다.
이렇게 하면 쿼리를 더 빠르고 메모리 집약적으로 사용할 수 있습니다.
공식 문서에 따르면,
Mongoose Document는 내부 상태가 많기 때문에 Javascript Object보다 훨씬 무거워서 쿼리 성능 향상을 위해서 lean()부터 이용하라고 가이드합니다.
const schema =new mongoose.Schema({ name: String });
const MyModel = mongoose.model('Test', schema);
await MyModel.create({ name: 'test' });
// Module that estimates the size of an object in memoryconst sizeof = require('object-sizeof');
const normalDoc =await MyModel.findOne();
// To enable the `lean` option for a query, use the `lean()` function.const leanDoc =await MyModel.findOne().lean();
sizeof(normalDoc);// approximately 600
sizeof(leanDoc);// 36, more than 10x smaller!
주의사항
당연하지만 lean()을 이용해 쿼리 한 객체에는 아래와 같은 것들이 없기 때문에 주의하여 사용해야 합니다.
- Change tracking
- Casting and validation
- Getters and setters
- Virtuals
- save()
아래의 글을 참고하여 작성하였습니다.
'DataBase' 카테고리의 다른 글
MongoDB에서 효율적으로 페이징 처리하기(pagination) (0) | 2022.11.11 |
---|---|
SQL, NoSQL 비교(특징, 스키마, 속도, 확장) (2) | 2021.09.01 |