NestJSでのデータベース統合と利用
- 848単語
- 4分
- 11 Jul, 2024
この記事では、NestJSプロジェクトで関係データベースと非関係データベースを統合して使用する方法について詳しく説明します。具体的には、データベースの設定、モデル設計、および複雑なクエリの実現方法を紹介します。
関係データベースの統合
TypeORMの設定
TypeORMは多くの関係データベースをサポートする強力なORMツールです。ここでは、MySQLを例にTypeORMの設定方法を紹介します。
- 必要なパッケージをインストール:
1npm install --save @nestjs/typeorm typeorm mysql2
app.module.ts
でTypeORMを設定:
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { UsersModule } from "./users/users.module";4
5@Module({6 imports: [7 TypeOrmModule.forRoot({8 type: "mysql",9 host: "localhost",10 port: 3306,11 username: "root",12 password: "password",13 database: "test",14 entities: [__dirname + "/**/*.entity{.ts,.js}"],15 synchronize: true,16 }),17 UsersModule,18 ],19})20export class AppModule {}
データベースモデルの設計
User
エンティティを作成し、ユーザーのデータベースモデルを定義:
1import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";2
3@Entity()4export class User {5 @PrimaryGeneratedColumn()6 id: number;7
8 @Column()9 name: string;10
11 @Column()12 email: string;13
14 @Column()15 password: string;16}
データベース操作
users.service.ts
でCRUD操作を実装:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { User } from "./user.entity";5
6@Injectable()7export class UsersService {8 constructor(9 @InjectRepository(User)10 private usersRepository: Repository<User>,11 ) {}12
13 findAll(): Promise<User[]> {14 return this.usersRepository.find();15 }16
17 findOne(id: number): Promise<User> {18 return this.usersRepository.findOne(id);19 }20
21 create(user: User): Promise<User> {22 return this.usersRepository.save(user);23 }24
25 async update(id: number, user: Partial<User>): Promise<void> {26 await this.usersRepository.update(id, user);27 }28
29 async remove(id: number): Promise<void> {30 await this.usersRepository.delete(id);31 }32}
複雑なクエリの実現
users.service.ts
で複雑なクエリを実装:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { User } from "./user.entity";5
6@Injectable()7export class UsersService {8 constructor(9 @InjectRepository(User)10 private usersRepository: Repository<User>,11 ) {}12
13 // 複雑なクエリ例:特定のキーワードを含むユーザーを検索14 async findUsersByKeyword(keyword: string): Promise<User[]> {15 return this.usersRepository16 .createQueryBuilder("user")17 .where("user.name LIKE :keyword OR user.email LIKE :keyword", {18 keyword: `%${keyword}%`,19 })20 .getMany();21 }22}
非関係データベースの統合
Mongooseの設定
MongooseはMongoDBに適した人気のあるODMツールです。ここでは、Mongooseの設定方法を紹介します。
- 必要なパッケージをインストール:
1npm install --save @nestjs/mongoose mongoose
app.module.ts
でMongooseを設定:
1import { Module } from "@nestjs/common";2import { MongooseModule } from "@nestjs/mongoose";3import { UsersModule } from "./users/users.module";4
5@Module({6 imports: [MongooseModule.forRoot("mongodb://localhost/nest"), UsersModule],7})8export class AppModule {}
データベースモデルの設計
User
モデルを作成し、ユーザーのデータベースモデルを定義:
1import { Schema } from "mongoose";2
3export const UserSchema = new Schema({4 name: String,5 email: String,6 password: String,7});
データベース操作
users.service.ts
でCRUD操作を実装:
1import { Injectable } from "@nestjs/common";2import { InjectModel } from "@nestjs/mongoose";3import { Model } from "mongoose";4import { User } from "./user.interface";5import { CreateUserDto } from "./create-user.dto";6
7@Injectable()8export class UsersService {9 constructor(@InjectModel("User") private readonly userModel: Model<User>) {}10
11 async findAll(): Promise<User[]> {12 return this.userModel.find().exec();13 }14
15 async findOne(id: string): Promise<User> {16 return this.userModel.findById(id).exec();17 }18
19 async create(createUserDto: CreateUserDto): Promise<User> {20 const createdUser = new this.userModel(createUserDto);21 return createdUser.save();22 }23
24 async update(id: string, user: Partial<User>): Promise<User> {25 return this.userModel.findByIdAndUpdate(id, user, { new: true }).exec();26 }27
28 async remove(id: string): Promise<User> {29 return this.userModel.findByIdAndRemove(id).exec();30 }31}
複雑なクエリの実現
users.service.ts
で複雑なクエリを実装:
1import { Injectable } from "@nestjs/common";2import { InjectModel } from "@nestjs/mongoose";3import { Model } from "mongoose";4import { User } from "./user.interface";5
6@Injectable()7export class UsersService {8 constructor(@InjectModel("User") private readonly userModel: Model<User>) {}9
10 // 複雑なクエリ例:特定のキーワードを含むユーザーを検索11 async findUsersByKeyword(keyword: string): Promise<User[]> {12 return this.userModel13 .find({14 $or: [15 { name: new RegExp(keyword, "i") },16 { email: new RegExp(keyword, "i") },17 ],18 })19 .exec();20 }21}
まとめ
この記事では、NestJSで関係データベースと非関係データベースを統合して使用する方法について詳しく説明しました。TypeORMとMongooseを使用した具体的な設定とコード例を通じて、データベース操作、モデル設計、および複雑なクエリの実現方法を紹介しました。実際の開発において、適切なデータベースとORM/ODMツールを選択することは、効率的でスケーラブルなアプリケーションの構築において重要です。