前言
在现代 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 包
npm install -g @nestjs/cli nest new project-name cd project-name npm install --save @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