npm 包 @quickts/nestjs-mongodb 使用教程

前言

在现代 Web 开发中,使用数据库存储数据已成为常态。Node.js 生态圈中有许多优秀的数据库操作库,而在这些库中 MongoDB 变得越来越受欢迎。Nest.js 作为目前流行的 Node.js Web 开发框架,对 MongoDB 的支持也越来越完善。@quickts/nestjs-mongodb 就是一个基于 Nest.js 对 MongoDB 进行封装的 npm 包,它简化了 MongoDB 数据库操作的复杂度,提高了开发效率。

本文将详细讲解如何使用 @quickts/nestjs-mongodb 包进行 MongoDB 数据库的操作。

环境准备

安装 Node.js 和 npm 包管理工具,具体方法可参考 Node.js 中文网:https://nodejs.org/zh-cn/download/

安装 Nest.js 框架和 @quickts/nestjs-mongodb 包

基本用法

在 Nest.js 中使用 @quickts/nestjs-mongodb 包需要先进行初始化,然后才能使用链接、Entity、Repository 等功能。

初始化

在主模块(可以是 app.module.ts 或其他你命名的模块)中进行初始化。

// app.module.ts

@Module({
  imports: [
    QuickMongoDBModule.forRoot({
      uri: 'mongodb://localhost:27017',
      dbName: 'test',
      entities: [User],
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

在 forRoot 中,我们需要传入 MongoDB 的连接字符串 uri,数据库名 dbName 和实体 entities 参数,其中 entities 是实体类数组。

Entity

实体类用于描述 MongoDB 中的一个文档。我们需要使用 @quickts/nestjs-mongodb 中的 QuickMongoDBEntity 来声明实体类,并通过 @Index 声明索引和 @Prop 声明字段。例如:

// user.entity.ts
import { QuickMongoDBEntity, QuickMongoDBIndex } from '@quickts/nestjs-mongodb';

@QuickMongoDBIndex({ username: 1 }, { unique: true })
export class User extends QuickMongoDBEntity {
  @Prop()
  username: string;
  @Prop()
  password: string;
  @Prop()
  email: string;
}

在上面的例子中,我们声明了一个 User 实体类,其中声明了三个字段:username、password 和 email。username 设定为索引,且唯一。

Repository

@quickts/nestjs-mongodb 包中的 Repository 实现了 MongoDB 中的基本 CRUD 操作,让开发者更加方便地进行数据库操作。

在 Nest.js 框架中,使用 @InjectRepository 将 Repository 注入到需要的服务中。

// user.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@quickts/nestjs-mongodb';
import { User } from './user.entity';
import { Repository } from 'mongodb';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: Repository<User>,
  ) {}

  async create(user): Promise<User> {
    return await this.userRepository.create(user);
  }

  async findAll(): Promise<User[]> {
    return await this.userRepository.findAll();
  }

  async findOne(username: string): Promise<User> {
    return await this.userRepository.findOne({ username });
  }

  async update(username: string, user): Promise<User> {
    return await this.userRepository.updateOne({ username }, user);
  }

  async delete(username: string) {
    return await this.userRepository.deleteOne({ username });
  }
}

在上面的例子中,我们创建了一个 UserService,其中通过 @InjectRepository(User) 注入了 UserRepository,然后实现了 create、findAll、findOne、update 和 delete 等基本方法。

高级用法

聚合操作

在 MongoDB 中,聚合操作能够更加方便地进行数据处理和分析。@quickts/nestjs-mongodb 支持 MongoDB 的聚合操作。

// user.service.ts

async findTotal() {
  return await this.userRepository.aggregate([
    { $match: { status: 0 } },
    { $group: { _id: null, total: { $sum: '$salary' } } },
  ]);
}

async groupByProvince() {
  return await this.userRepository.aggregate([
    {
      $group: {
        _id: { province: '$province' },
        count: { $sum: 1 },
      },
    },
    { $sort: { count: -1 } },
  ]);
}

async join() {
  return await this.userRepository
    .aggregate()
    .lookup({
      from: 'order',
      localField: 'userId',
      foreignField: 'userId',
      as: 'orders',
    })
    .addFields({
      orderCount: { $size: '$orders' },
      totalPrice: {
        $reduce: {
          input: '$orders',
          initialValue: 0,
          in: { $add: ['$$value', '$$this.price'] },
        },
      },
    })
    .project({
      username: 1,
      orderCount: 1,
      totalPrice: 1,
      _id: 0,
    })
    .toArray();
}

在上面的例子中,我们分别实现了三个聚合操作:计算 document 的总数、按省份分组并排序,以及 join 操作。需要注意的是,@quickts/nestjs-mongodb 中的聚合操作都是按照 MongoDB 的聚合语法进行实现的。

事务操作

事务是一组逻辑操作单元,它要么全部执行,要么全部回滚,保证操作的原子性和一致性。

在 MongoDB 4.x 中,可以支持事务操作。@quickts/nestjs-mongodb 通过 QuickMongoDBTransactionManager 封装了 MongoDB 的事务操作。例如:

// user.service.ts

async transaction() {
  await this.userRepository.runTransaction(async (session) => {
    const user = { username: 'user1', password: 'password1', email: 'email1' };
    const order = { userId: 'user1', price: 100 };
    await this.userRepository.create(user, { session });
    await this.orderRepository.create(order, { session });
  });
}

在上面的例子中,我们在一个事务中进行了对 User 和 Order 的创建操作。

批处理操作

批处理就是在一个事务中进行多个数据操作。

// user.service.ts

async batch() {
  const batch = this.userRepository.createBatch();
  batch.insertOne({ username: 'user1', password: 'password1', email: 'email1' });
  batch.updateOne({ username: 'user2' }, { $set: { password: 'password2' } });
  batch.deleteOne({ username: 'user3' });
  await batch.execute();
}

在上面的例子中,我们首先创建了一个 QuickMongoDBBatch 实例,然后对 User 进行了 insertOne、updateOne 和 deleteOne 操作。

总结

本文介绍了如何使用 @quickts/nestjs-mongodb 包来简化在 Nest.js 中对 MongoDB 的数据库操作。我们首先讲解了基本用法,然后逐步深入,介绍了更多高级用法,如聚合操作、事务操作和批处理等。希望对你在 Nest.js 开发中进行 MongoDB 数据库操作有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/600673defb81d47349e53bf7


纠错
反馈