Query Helpers in TypeScriptTypeScript中的查询帮助程序
Query helpers查询帮助程序 let you define custom helper methods on Mongoose queries. Query helpers make queries more semantic using chaining syntax.让您可以在Mongoose查询上定义自定义助手方法。查询助手使用链接语法使查询更具语义。
The following is an example of how query helpers work in JavaScript.以下是查询助手如何在JavaScript中工作的示例。
ProjectSchema.query.byName = function(name) {
return this.find({ name: name });
};
const Project = mongoose.model('Project', ProjectSchema);
// Works. Any Project query, whether it be `find()`, `findOne()`,
// `findOneAndUpdate()`, `delete()`, etc. now has a `byName()` helper
Project.find().where('stars').gt(1000).byName('mongoose');
Manually Typed Query Helpers手动键入的查询帮助程序
In TypeScript, you can define query helpers using a separate query helpers interface. 在TypeScript中,可以使用单独的查询助手接口定义查询助手。Mongoose's Mongoose的Model
takes 3 generic parameters:Model
采用3个通用参数:
- The
DocType
- a
TQueryHelpers
type - a
TMethods
type
The 2nd generic parameter, 第二个通用参数TQueryHelpers
, should be an interface that contains a function signature for each of your query helpers. TQueryHelpers
应该是一个包含每个查询助手的函数签名的接口。Below is an example of creating a 以下是使用ProjectModel
with a byName
query helper.byName
查询帮助程序创建ProjectModel
的示例。
import { HydratedDocument, Model, Query, Schema, model } from 'mongoose';
interface Project {
name?: string;
stars?: number;
}
interface ProjectQueryHelpers {
byName(name: string): QueryWithHelpers<
HydratedDocument<Project>[],
HydratedDocument<Project>,
ProjectQueryHelpers
>
}
type ProjectModelType = Model<Project, ProjectQueryHelpers>;
const ProjectSchema = new Schema<
Project,
Model<Project, ProjectQueryHelpers>,
{},
ProjectQueryHelpers
>({
name: String,
stars: Number
});
ProjectSchema.query.byName = function byName(
this: QueryWithHelpers<any, HydratedDocument<Project>, ProjectQueryHelpers>,
name: string
) {
return this.find({ name: name });
};
// 2nd param to `model()` is the Model class to return.
const ProjectModel = model<Project, ProjectModelType>('Project', schema);
run().catch(err => console.log(err));
async function run(): Promise<void> {
await connect('mongodb://127.0.0.1:27017/test');
// Equivalent to `ProjectModel.find({ stars: { $gt: 1000 }, name: 'mongoose' })`
await ProjectModel.find().where('stars').gt(1000).byName('mongoose');
}
Auto Typed Query Helpers自动键入的查询帮助程序
Mongoose does support auto typed Query Helpers that it are supplied in schema options. Mongoose确实支持模式选项中提供的自动类型查询帮助程序。Query Helpers functions can be defined as following:查询帮助程序功能可以定义如下:
import { Schema, model } from 'mongoose';
const ProjectSchema = new Schema({
name: String,
stars: Number
}, {
query: {
byName(name: string) {
return this.find({ name });
}
}
});
const ProjectModel = model('Project', ProjectSchema);
// Equivalent to `ProjectModel.find({ stars: { $gt: 1000 }, name: 'mongoose' })`
await ProjectModel.find().where('stars').gt(1000).byName('mongoose');