1
+ <!DOCTYPE html> < html lang ="en "> < head > < meta charset ="utf-8 "> < meta name ="viewport " content ="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no "> < title > Mongoose v8.14.1: Mongoose: Queries in TypeScript</ title > < link rel ="apple-touch-icon " sizes ="57x57 " href ="/docs/images/favicon/apple-icon-57x57.png "> < link rel ="apple-touch-icon " sizes ="60x60 " href ="/docs/images/favicon/apple-icon-60x60.png "> < link rel ="apple-touch-icon " sizes ="72x72 " href ="/docs/images/favicon/apple-icon-72x72.png "> < link rel ="apple-touch-icon " sizes ="76x76 " href ="/docs/images/favicon/apple-icon-76x76.png "> < link rel ="apple-touch-icon " sizes ="114x114 " href ="/docs/images/favicon/apple-icon-114x114.png "> < link rel ="apple-touch-icon " sizes ="120x120 " href ="/docs/images/favicon/apple-icon-120x120.png "> < link rel ="apple-touch-icon " sizes ="144x144 " href ="/docs/images/favicon/apple-icon-144x144.png "> < link rel ="apple-touch-icon " sizes ="152x152 " href ="/docs/images/favicon/apple-icon-152x152.png "> < link rel ="apple-touch-icon " sizes ="180x180 " href ="/docs/images/favicon/apple-icon-180x180.png "> < link rel ="icon " type ="image/png " sizes ="192x192 " href ="/docs/images/favicon/android-icon-192x192.png "> < link rel ="icon " type ="image/png " sizes ="32x32 " href ="/docs/images/favicon/favicon-32x32.png "> < link rel ="icon " type ="image/png " sizes ="96x96 " href ="/docs/images/favicon/favicon-96x96.png "> < link rel ="icon " type ="image/png " sizes ="16x16 " href ="/docs/images/favicon/favicon-16x16.png "> < link rel ="manifest " href ="/docs/images/favicon/manifest.json "> < link rel ="stylesheet " href ="https://unpkg.com/purecss@1.0.1/build/pure-min.css " integrity ="sha384-oAOxQR6DkCoMliIh8yFnu25d7Eq/PHS21PClpwjOTeU2jRSq11vu66rf90/cZr47 " crossorigin ="anonymous "> < link rel ="stylesheet " href ="https://fonts.googleapis.com/css?family=Open+Sans "> < link rel ="stylesheet " href ="/docs/css/github.css "> < link rel ="stylesheet " href ="/docs/css/mongoose5.css "> < link rel ="stylesheet " href ="/docs/css/carbonads.css "> < meta name ="msapplication-TileColor " content ="#ffffff "> < meta name ="msapplication-TileImage " content ="/docs/images/favicon/ms-icon-144x144.png "> < meta name ="theme-color " content ="#ffffff "> < link rel ="stylesheet " href ="/docs/css/inlinecpc.css "> < script type ="text/javascript " src ="/docs/js/native.js "> </ script > < style > p { line-height : 1.5em }
2
+ </ style > </ head > < body > < div id ="layout "> < div id ="mobile-menu "> < a class ="menu-link " id ="menuLink " href ="#menu "> < svg width ="100% " height ="100% " viewBox ="0 0 30 30 " aria-hidden ="true "> < path stroke ="currentColor " stroke-linecap ="round " stroke-miterlimit ="10 " stroke-width ="2 " d ="M4 7h22M4 15h22M4 23h22 "> </ path > </ svg > </ a > < div id ="mobile-logo-container "> < a href ="/ "> < img id ="logo " src ="/docs/images/mongoose5_62x30_transparent.png "> < span class ="logo-text "> mongoose</ span > </ a > </ div > </ div > < div id ="menu "> < nav class ="pure-menu "> < div class ="pure-menu-heading " id ="logo-container "> < a href ="/ "> < img id ="logo " src ="/docs/images/mongoose5_62x30_transparent.png "> < span class ="logo-text "> mongoose</ span > </ a > </ div > < ul class ="pure-menu-list " id ="navbar "> < li class ="pure-menu-horizontal pure-menu-item pure-menu-has-children pure-menu-allow-hover version "> < a class ="pure-menu-link " href ="/docs/index.html "> Version 8.14.1</ a > < ul class ="pure-menu-children "> < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/7.x/index.html "> Version 7.8.6</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/6.x/index.html "> Version 6.13.8</ a > </ li > </ ul > </ li > < li class ="pure-menu-item search "> < input id ="search-input-nav " type ="text " placeholder ="Search "> < button id ="search-button-nav "> < img src ="/docs/images/search.svg "> </ button > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/index.html "> Quick Start</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/guides.html "> Guides</ a > < ul class ="pure-menu-list "> < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/guide.html "> Schemas</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/schematypes.html "> SchemaTypes</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/connections.html "> Connections</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/models.html "> Models</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/documents.html "> Documents</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/subdocs.html "> Subdocuments</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/queries.html "> Queries</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/validation.html "> Validation</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/middleware.html "> Middleware</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/populate.html "> Populate</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/discriminators.html "> Discriminators</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/plugins.html "> Plugins</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/timestamps.html "> Timestamps</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/transactions.html "> Transactions</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/typescript.html "> TypeScript</ a > < ul class ="pure-menu-list "> < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/typescript/schemas.html "> Schemas</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/typescript/statics-and-methods.html "> Statics and Methods</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link selected " href ="/docs/typescript/queries.html "> Queries</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/typescript/query-helpers.html "> Query Helpers</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/typescript/populate.html "> Populate</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/typescript/subdocuments.html "> Subdocuments</ a > </ li > </ ul > </ li > </ ul > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/api/mongoose.html "> API</ a > < ul class ="pure-menu-list "> < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/mongoose.html "> Mongoose</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/schema.html "> Schema</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/connection.html "> Connection</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/document.html "> Document</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/model.html "> Model</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/query.html "> Query</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/aggregate.html "> Aggregate</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/schematype.html "> SchemaType</ a > </ li > < li class ="pure-menu-item sub-item "> < a class ="pure-menu-link " href ="/docs/api/virtualtype.html "> VirtualType</ a > </ li > </ ul > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/migrating_to_8.html "> Migration Guide</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/compatibility.html "> Version Compatibility</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/version-support.html "> Version Support</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/faq.html "> FAQ</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/further_reading.html "> Further Reading</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/enterprise.html "> For Enterprise</ a > </ li > < li class ="pure-menu-item "> < a class ="pure-menu-link " href ="/docs/sponsors.html " > Sponsors</ a > </ li > </ ul > < div class ="cpc-ad "> < script async type ="text/javascript " src ="//cdn.carbonads.com/carbon.js?serve=CKYIL27I&placement=mongoosejscom " id ="_carbonads_js "> </ script > </ div > </ nav > </ div > < div class ="container "> < div id ="content "> < a class ="edit-docs-link " href ="https://github.com/Automattic/mongoose/blob/master/docs/typescript/queries.md " target ="_blank ">
3
+ < img src ="/docs/images/pencil.svg " />
4
+ </ a > < h1 id ="queries-in-typescript ">
5
+ < a href ="#queries-in-typescript ">
6
+ Queries in TypeScript
7
+ </ a >
8
+ </ h1 >
9
+ < div class ="sponsored-ad ">
10
+ < a href ="https://localizejs.com/?utm_campaign=Mongoose&utm_source=mongoose&utm_medium=banner ">
11
+ < img src ="/docs/images/localize-mongoose-ad-banner-2x.jpg ">
12
+ </ a >
13
+ </ div >
14
+
15
+ < p > Mongoose's < a href ="../api/query.html "> Query class</ a > is a chainable query builder that represents a MongoDB query.
16
+ When you call < code > find()</ code > , < code > findOne()</ code > , < code > updateOne()</ code > , < code > findOneAndUpdate()</ code > , etc. on a model, Mongoose will return a Query instance.
17
+ Queries have a < code > .then()</ code > function that returns a Promise, so you can use them with < code > await</ code > .</ p >
18
+ < p > In TypeScript, the Query class takes the following generic parameters:</ p >
19
+ < pre > < code lang ="ts "> < span class ="hljs-keyword "> class</ span > < span class ="hljs-title class_ "> Query</ span > <
20
+ < span class ="hljs-title class_ "> ResultType</ span > , < span class ="hljs-comment "> // The type of the result of the query, like `DocType[]`</ span >
21
+ < span class ="hljs-title class_ "> DocType</ span > , < span class ="hljs-comment "> // The hydrated document type of the query's associated model</ span >
22
+ < span class ="hljs-title class_ "> THelpers</ span > = {}, < span class ="hljs-comment "> // Query helpers</ span >
23
+ < span class ="hljs-title class_ "> RawDocType</ span > = < span class ="hljs-built_in "> unknown</ span > , < span class ="hljs-comment "> // The "lean" document type of the query's associated model</ span >
24
+ < span class ="hljs-title class_ "> QueryOp</ span > = < span class ="hljs-string "> 'find'</ span > , < span class ="hljs-comment "> // The operation that will be executed, like 'find', 'findOne', 'updateOne', etc.</ span >
25
+ < span class ="hljs-title class_ "> TDocOverrides</ span > = < span class ="hljs-title class_ "> Record</ span > << span class ="hljs-built_in "> string</ span > , < span class ="hljs-built_in "> never</ span > > < span class ="hljs-comment "> // Methods and virtuals on the hydrated document</ span >
26
+ ></ code > </ pre > < h2 id ="using-lean-in-typescript ">
27
+ < a href ="#using-lean-in-typescript ">
28
+ Using < code > lean()</ code > in TypeScript
29
+ </ a >
30
+ </ h2 >
31
+ < p > The < a href ="../tutorials/lean.html "> < code > lean()</ code > method</ a > tells Mongoose to skip < a href ="../api/model.html#model_Model-hydrate "> hydrating</ a > the result documents, making queries faster and more memory efficient.
32
+ < code > lean()</ code > comes with some caveats in TypeScript when working with the query < code > transform()</ code > function.
33
+ In general, we recommend calling < code > lean()</ code > before using the < code > transform()</ code > function to ensure accurate types.</ p >
34
+ < pre > < code lang ="ts "> < span class ="hljs-comment "> // Put `lean()` **before** `transform()` in TypeScript because `transform` modifies the query ResultType into a shape</ span >
35
+ < span class ="hljs-comment "> // that `lean()` does not know how to handle.</ span >
36
+ < span class ="hljs-keyword "> const</ span > result = < span class ="hljs-keyword "> await</ span > < span class ="hljs-title class_ "> ProjectModel</ span >
37
+ .< span class ="hljs-title function_ "> find</ span > ()
38
+ .< span class ="hljs-title function_ "> lean</ span > ()
39
+ .< span class ="hljs-title function_ "> transform</ span > (< span class ="hljs-function "> (< span class ="hljs-params "> docs</ span > ) =></ span > < span class ="hljs-keyword "> new</ span > < span class ="hljs-title class_ "> Map</ span > (docs.< span class ="hljs-title function_ "> map</ span > (< span class ="hljs-function "> (< span class ="hljs-params "> doc</ span > ) =></ span > [doc.< span class ="hljs-property "> _id</ span > .< span class ="hljs-title function_ "> toString</ span > (), doc])));
40
+
41
+ < span class ="hljs-comment "> // Do **not** do the following</ span >
42
+ < span class ="hljs-keyword "> const</ span > result = < span class ="hljs-keyword "> await</ span > < span class ="hljs-title class_ "> ProjectModel</ span >
43
+ .< span class ="hljs-title function_ "> find</ span > ()
44
+ .< span class ="hljs-title function_ "> transform</ span > (< span class ="hljs-function "> (< span class ="hljs-params "> docs</ span > ) =></ span > < span class ="hljs-keyword "> new</ span > < span class ="hljs-title class_ "> Map</ span > (docs.< span class ="hljs-title function_ "> map</ span > (< span class ="hljs-function "> (< span class ="hljs-params "> doc</ span > ) =></ span > [doc.< span class ="hljs-property "> _id</ span > .< span class ="hljs-title function_ "> toString</ span > (), doc])))
45
+ .< span class ="hljs-title function_ "> lean</ span > ();</ code > </ pre > < p > In general, if you're having trouble with < code > lean()</ code > inferring the correct type, you can try moving < code > lean()</ code > earlier in the query chain.</ p >
46
+ </ div > </ div > < div id ="jobs "> < div class ="job-listing "> < a href ="/docs/jobs.html#61f0b0402d893554bc3a247f "> < div class ="company-logo "> < img src ="https://assets.localizecdn.com/uploads/1689251999716.png "> </ div > < div class ="description "> < div class ="company "> Localize</ div > < div class ="title "> Full Stack Engineer</ div > < div class ="location "> Anywhere</ div > </ div > </ a > </ div > < div class ="button jobs-view-more "> < a href ="/docs/jobs.html "> View more jobs!</ a > </ div > </ div > < script type ="text/javascript " src ="/docs/js/navbar-search.js "> </ script > < script type ="text/javascript " src ="/docs/js/mobile-navbar-toggle.js "> </ script > </ div > </ body > </ html >
0 commit comments