跳到主要内容

6.4-mongooes

Create by fall on 21 May 2025
Recently revised in 21 May 2025

mongoose

集成到 nestjs

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
imports: [MongooseModule.forRoot('mongodb://localhost/nest')],
})
export class AppModule {}

mongoose 中一切皆为 Schema,每个 schema 对应一个集合(collection)Schema 通常用于定义模型,模型负责从 mongo 中读取以及创建文档

Schema

创建一个 Schema

nest 推荐放置在 module 同级目录的 schemas/<name>.schema.ts


import { Prop, Schema, SchemaFactory, raw } from '@nestjs/mongoose'
import { HydratedDocument } from 'mongoose'
import {Owner} from './owner.schema'
import * as mongoose from 'mongoose'
export type CatDocument = HydratedDocument<Cat>;
// schema 装饰器会创建一个相同名称,Cat 的集合,并且自动添加一个 s,最终的集合名为 cats
@Schema()
export class Cat {
@Prop()
name: string
@Prop()
age: number
@Prop()
breed: string
// 定义一些复杂的数据类型时,类型需要明确指出
@Prop([String])
tags: string[]
// 也可以定义必填等属性
@Prop({require:true,default:''})
lastFeedTime: string[]
// 如果想指定其它的模型,也可以使用 @Prop,比如和它的主人(Owner)表进行绑定
@Prop({type:mongoose.Schema.Types.ObjectId,ref:'Owner'})
owner:Owner
// 如果主人可以为多个
// @Prop({type:[{type:mongoose.Schema.Types.ObjectId,ref:'Owner'}]})
// owner:Owner[]
// 如果有一个属性值为 object,但是没有定义成 Schema class
@Prop(raw({
firstName: { type: String },
lastName: { type: String }
}))
details: Record<string, any>;

}
export const CatSchema = SchemaFactory.createForClass(Cat)

注册

// cat.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { Cat, CatSchema } from './schemas/cat.schema';

@Module({
// 定义那个模块应该被注册到当前作用域,如果你也想在其它地方使用 M
imports: [MongooseModule.forFeature([{ name: Cat.name, schema: CatSchema }])],
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
// cat.service.ts
import { Model } from 'mongoose';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Cat } from './schemas/cat.schema';
import { CreateCatDto } from './dto/create-cat.dto';

@Injectable()
export class CatsService {
// 使用 InjectModel 装饰器将 Cat 添加到 CatsService
constructor(@InjectModel(Cat.name) private catModel: Model<Cat>) {}

async create(createCatDto: CreateCatDto): Promise<Cat> {
const createdCat = new this.catModel(createCatDto);
return createdCat.save();
}

async findAll(): Promise<Cat[]> {
return this.catModel.find().exec();
}
}