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 |