Setup and Schemas

When MongoDB

MongoDB stores JSON-like documents. It fits data with flexible shapes: product reviews, activity feeds, logs, chat messages. Orders and payments usually stay in a relational database for transactions and joins.

Example

npm i @nestjs/mongoose mongoose

Example output

added 24 packages in 5s

A Schema with Decorators

src/reviews/schemas/review.schema.ts

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';

@Schema({ timestamps: true, collection: 'reviews' })
export class Review {
  @Prop({ required: true, index: true })
  productId: number;

  @Prop({ required: true })
  userId: number;

  @Prop({ required: true, min: 1, max: 5 })
  rating: number;

  @Prop({ maxlength: 2000 })
  comment?: string;

  @Prop({ type: [String], default: [] })
  images: string[];

  @Prop({ default: false })
  verifiedPurchase: boolean;
}

export type ReviewDocument = HydratedDocument<Review>;
export const ReviewSchema = SchemaFactory.createForClass(Review);
ReviewSchema.index({ productId: 1, userId: 1 }, { unique: true });   // one review per user per product

src/app.module.ts and src/reviews/reviews.module.ts

// app.module.ts
@Module({
  imports: [
    MongooseModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({ uri: config.getOrThrow<string>('MONGODB_URI') }),
    }),
    ReviewsModule,
  ],
})
export class AppModule {}

// reviews.module.ts
@Module({
  imports: [MongooseModule.forFeature([{ name: Review.name, schema: ReviewSchema }])],
  controllers: [ReviewsController],
  providers: [ReviewsService],
})
export class ReviewsModule {}