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();
  }
}