무심코 사용한 mongodb exec(), lean()
main
date
Jul 17, 2024
slug
mongo-exec-lean
author
status
Public
tags
Development
mongoDB
summary
type
Post
thumbnail
category
Development
updatedAt
Oct 12, 2025 10:44 AM
mongo query를 작성하다 보면 find 시 lean(), 집계 함수 사용 시 exec()을 별생각 없이 사용해 왔는데 이 둘은 어떤 역할을 하는 걸까?
(어느 때와 같이 쿼리를 작성하는 중에 습관처럼 붙이는 내 모습을 보며 문득 궁금해졌다.. 🤔)
return this.projectModel .findOne({ _id: objectId }, { _id: 0, campaignTitle: 1, sndNum: 1, sndGoalCnt: 1, atsGenerate: 1, toCallApi: 1, }).lean();
return await this.projectModel .aggregate([ { $match: { _id: objectId }, }, { $lookup: { from: 'template', let: { projectId: { $toString: '$_id' } }, pipeline: [ { $match: { $expr: { $eq: ['$targetProject', '$$projectId'], }, }, }, { $project: { isDelete: 0, targetProject: 0, }, }, ], as: 'templates', }, }, { $unwind: { path: '$templates', preserveNullAndEmptyArrays: true, }, }, { $project: { campaignIds: 0, campaignGroup: 0, samplingId: 0, samplingFilterIds: 0, isDelete: 0, createdDate: 0, sndGoalCnt: 0, deletedDate: 0, updatedDate: 0, atsGroupIds: 0, atsGenerate: 0, }, }, ]).exec();
lean
lean() 을 붙여 쿼리를 실행시키게 되면 Mongo Document가 아닌 Javascript Object(Plain Old JavaScript Object) 로 조회되게 된다.lean을 붙이지 않고 find를 할 경우 MongoDoucment가 조회가 되는데 이 때 Doucment는 내부에 많은 상태 값을 가지고 있어 Javscript Object보다 무거워진다.
따라서 단순 조회라면 lean을 사용하여 쿼리의 성능을 조금 이나마 높일 수 있다.
exec
mongoose에서 쿼리를 작성 후 실행 시킬 경우 결과 대신 쿼리 객체를 반환하게 된다.
이 때
exec() 를 사용하면 쿼리 객체가 아닌 쿼리를 실행 시킨 결과를 반환하게 된다.또한 온전한 프로미스를 반환하여 결과 값을 확인할 수 있다.