Framework/Nest.js

7. Nest.js, mongoose로 mongoDB 사용하기

oniri1 2024. 9. 20. 21:23
npm i @nestjs/mongoose mongoose

0. app.module.ts 전역 추가

import { MongooseModule } from '@nestjs/mongoose';
import { UserModule } from './user/user.module';
@Module({
    imports: [
        MongooseModule.forRoot('mongodb://localhost:27017/nest'), // MongoDB URI
        UserModule,],})

nest 라는 이름의 데이터베이스에 연결하는 URI이며 필요에 따라 URI를 변경할 수 있다.
/nest를 하면 mongoDB안에 nest라는 데이터 베이스에 접속한다. 없으면 데이터 베이스를 만듬

1. 스키마 파일 작성

user.schema.ts

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

@Schema() //클래스가 스키마임을 정의
export class User extends Document {
  @Prop({ required: true }) //필드 정의
  name: string;

  @Prop()
  age: number;

  @Prop({ required: true, unique: true })
  email: string;
}
export const UserSchema = SchemaFactory.createForClass(User);

2. 원하는 module에 import

import { FeedBack, FeedBackSchema } from './mongoDB/feedback.schema';

imports: [
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]), // User 스키마 등록
],

3. 서비스 작성

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { User } from './user.schema';

@Injectable()
export class UserService {
  constructor(@InjectModel(User.name) private userModel: Model<User>) {}

  async createUser(name: string, age: number, email: string): Promise<User> {
    const newUser = new this.userModel({ name, age, email });
    return newUser.save();
  }

  async findAllUsers(): Promise<User[]> {
    return this.userModel.find().exec();
  }
}

4. 컨트롤러 작성

import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.schema';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  async createUser(
      @Body('name') name: string,
      @Body('age') age: number,
      @Body('email') email: string): Promise<User> {
    return this.userService.createUser(name, age, email);
  }

  @Get()
  async findAllUsers(): Promise<User[]> {
    return this.userService.findAllUsers();
  }
}

Mongose 인스턴스 명령어

  • find():
    • 설명: 데이터베이스에서 조건에 맞는 모든 도큐먼트를 찾습니다.
    • 사용법: this.userModel.find(conditions).exec();
    • 예시: this.userModel.find({ age: { $gt: 18 } }).exec(); - 나이가 18세 이상인 모든 사용자를 찾습니다.
  • findOne():
    • 설명: 데이터베이스에서 조건에 맞는 첫 번째 도큐먼트를 찾습니다.
    • 사용법: this.userModel.findOne(conditions).exec();
    • 예시: this.userModel.findOne({ email: 'example@example.com' }).exec(); - 특정 이메일을 가진 사용자를 찾습니다.
  • findById():
    • 설명: 주어진 ID를 사용하여 도큐먼트를 찾습니다.
    • 사용법: this.userModel.findById(id).exec();
    • 예시: this.userModel.findById('60c72b1f9f1b2c001c8e4d9e').exec(); - 특정 ID를 가진 사용자를 찾습니다.
  • create():
    • 설명: 새로운 도큐먼트를 생성합니다.
    • 사용법: this.userModel.create(document);
    • 예시: this.userModel.create({ name: 'John', age: 30 }); - 새로운 사용자를 생성합니다.
  • insertMany():
    • 설명: 여러 개의 도큐먼트를 한 번에 삽입합니다.
    • 사용법: this.userModel.insertMany(documents);
    • 예시: this.userModel.insertMany([{ name: 'John' }, { name: 'Jane' }]); - 여러 명의 사용자를 한 번에 생성합니다.
  • updateOne():
    • 설명: 조건에 맞는 첫 번째 도큐먼트를 업데이트합니다.
    • 사용법: this.userModel.updateOne(conditions, update).exec();
    • 예시: this.userModel.updateOne({ name: 'John' }, { age: 31 }).exec(); - 이름이 John인 사용자의 나이를 31로 업데이트합니다.
  • updateMany():
    • 설명: 조건에 맞는 모든 도큐먼트를 업데이트합니다.
    • 사용법: this.userModel.updateMany(conditions, update).exec();
    • 예시: this.userModel.updateMany({ age: { $lt: 18 } }, { status: 'minor' }).exec(); - 18세 미만인 모든 사용자에게 'minor' 상태를 설정합니다.
  • findByIdAndUpdate():
    • 설명: 주어진 ID로 도큐먼트를 찾고, 업데이트합니다.
    • 사용법: this.userModel.findByIdAndUpdate(id, update).exec();
    • 예시: this.userModel.findByIdAndUpdate('60c72b1f9f1b2c001c8e4d9e', { age: 32 }).exec(); - 특정 ID를 가진 사용자의 나이를 32로 업데이트합니다.
  • deleteOne():
    • 설명: 조건에 맞는 첫 번째 도큐먼트를 삭제합니다.
    • 사용법: this.userModel.deleteOne(conditions).exec();
    • 예시: this.userModel.deleteOne({ email: 'example@example.com' }).exec(); - 특정 이메일을 가진 사용자를 삭제합니다.
  • deleteMany():
    • 설명: 조건에 맞는 모든 도큐먼트를 삭제합니다.
    • 사용법: this.userModel.deleteMany(conditions).exec();
    • 예시: this.userModel.deleteMany({ age: { $lt: 18 } }).exec(); - 18세 미만인 모든 사용자를 삭제합니다.
  • findByIdAndDelete():
    • 설명: 주어진 ID로 도큐먼트를 찾고, 삭제합니다.
    • 사용법: this.userModel.findByIdAndDelete(id).exec();
    • 예시: this.userModel.findByIdAndDelete('60c72b1f9f1b2c001c8e4d9e').exec(); - 특정 ID를 가진 사용자를 삭제합니다.
  • countDocuments():
    • 설명: 조건에 맞는 도큐먼트의 수를 셉니다.
    • 사용법: this.userModel.countDocuments(conditions).exec();
    • 예시: this.userModel.countDocuments({ age: { $gt: 18 } }).exec(); - 18세 이상의 사용자의 수를 셉니다.
  • aggregate():
    • 설명: 데이터 집계 작업을 수행합니다.
    • 사용법: this.userModel.aggregate(pipeline).exec();
    • 예시: this.userModel.aggregate([{ $match: { age: { $gt: 18 } } }]).exec(); - 18세 이상의 사용자를 필터링하는 집계 작업을 수행합니다.
  • distinct():
    • 설명: 특정 필드의 고유한 값들을 반환합니다.
    • 사용법: this.userModel.distinct(field, conditions).exec();
    • 예시: this.userModel.distinct('age').exec(); - 모든 사용자의 고유한 나이 값을 반환합니다.
  • populate():
    • 설명: 참조된 다른 도큐먼트를 조회하여 필드를 채웁니다.
    • 사용법: this.userModel.find().populate('relatedField').exec();
    • 예시: this.userModel.find().populate('friends').exec(); - 사용자와 연결된 친구 목록을 채워 반환합니다.
  • lean():
    • 설명: Mongoose 도큐먼트 대신 POJO(Plain Old JavaScript Object)를 반환합니다.
    • 사용법: this.userModel.find().lean().exec();
    • 예시: this.userModel.find().lean().exec(); - 사용자 도큐먼트를 단순한 JavaScript 객체로 반환합니다.
  • exec():
    • 설명: 쿼리를 실행하여 결과를 반환합니다. exec()는 Promise를 반환하여 비동기 처리를 도와줍니다.
    • 사용법: this.userModel.find().exec();
    • 예시: this.userModel.find().exec(); - 사용자 목록을 반환합니다.
  • sort():
    • 설명: 조건에 만족하는 데이터의 순서를 설정합니다.
    • 사용법: `this.userModel.findOne({ name: { $regex: 'ser', $options: 'i' } }).sort({ number: -1 }).exec();
    간단 예
  • const result = await this.userModel .findOne({ name: { $regex: 'ser', $options: 'i' } }) // $regex 정규식을 사용하여 `name` 필드에 `"ser"` 문자열이 포함된 문서를 찾습니다. `$options: 'i'`는 대소문자를 구분하지 않는 옵션입니다. .sort({ number: -1 }) // number 필드를 기준으로 내림차순 정렬 .exec(); // 쿼리 실행

# 조건 명령어

\[\[MongoDB query\]\]

1.  **Equality(동등) 연산자**: 지정된 값과 필드의 값을 비교합니다.
    -   `{ field: value }`: 필드 값이 주어진 값과 동일한 문서를 찾습니다.
2.  **Comparison(비교) 연산자**: 필드 값을 다른 값과 비교합니다.
    -   `{ field: { $gt: value } }`: 필드 값이 주어진 값보다 큰 문서를 찾습니다.
    -   `{ field: { $lt: value } }`: 필드 값이 주어진 값보다 작은 문서를 찾습니다.
    -   `{ field: { $gte: value } }`: 필드 값이 주어진 값보다 크거나 같은 문서를 찾습니다.
    -   `{ field: { $lte: value } }`: 필드 값이 주어진 값보다 작거나 같은 문서를 찾습니다.
    -   `{ field: { $eq: value } }`: 필드 값이 주어진 값과 같은 문서를 찾습니다.
3.  **Logical(논리) 연산자**: 여러 개의 조건을 조합합니다.
    -   `{ $and: [ { condition1 }, { condition2 } ] }`: 모든 조건을 만족하는 문서를 찾습니다.
    -   `{ $or: [ { condition1 }, { condition2 } ] }`: 적어도 하나의 조건을 만족하는 문서를 찾습니다.
    -   `{ $not: { condition } }`: 주어진 조건을 만족하지 않는 문서를 찾습니다.
    -   예: `db.mycollection.find({$and:[{"name":"John"},{"age":30}]})`
4.  **Element(요소) 연산자**: 필드의 존재나 값의 유형을 확인합니다.
    -   `{ field: { $exists: true } }`: 지정된 필드가 존재하는 문서를 찾습니다.
5.  **Array(배열) 연산자**: 배열 필드에 대한 조건을 지정합니다.
    -   `{ field: { $elemMatch: { condition } } }`: 배열 필드에서 조건을 충족하는 요소를 포함하는 문서를 찾습니다.
6.  **정규 표현식 연산자**: 필드 값에 대한 정규 표현식을 사용하여 검색합니다.
    -   `{ field: /pattern/ }`: 필드 값이 주어진 정규 표현식 패턴과 일치하는 문서를 찾습니다.

'Framework > Nest.js' 카테고리의 다른 글

8. Nest.js 배포시 주의할 점  (0) 2024.09.20
6. Nest.js, typeorm으로 MySql 사용하기  (0) 2024.09.20
5. Nest.js, env 적용하기  (0) 2024.09.20
4. Nest.js, Cors 설정  (0) 2024.09.20
3. Nest.js nodemon을 적용시키자  (0) 2024.09.20