Mongodb index 생성 방법 정리해둔다. NestJS Mongoose 설정 방법은 아래 글을 참조하길 바란다.
https://cocook.tistory.com/183
아래처럼 생긴 모델일 때 인덱스 생성하기
@Schema()
export class Friend {
@Prop()
category: string
@Prop({ default: Date.now() })
createdAt: Date;
@Prop({ required: true, type: mongoose.Schema.Types.ObjectId, ref: "User" })
userId: string;
@Prop({ required: true, type: mongoose.Schema.Types.ObjectId, ref: "User" })
targetUserId: string;
}
export const FriendSchema = SchemaFactory.createForClass(Friend);
1. 기본 인덱스
일단 몽고DB에서는 ref된 값이라고 하더라도 _id를 제외하곤 인덱스를 자동으로 걸어주지 않는다. 따라서 필요하다면 reference된 값에서도 인덱스를 걸어줄 것!
FriendSchema.index({
userId: 1,
});
아래처럼 복합 인덱스도 가능하다.
FriendSchema.index({
userId: 1,
targetUserId:1
아무노래나일단틀어: 1
});
Subdocument에 대한 인덱스는 아래와 같이 걸수 있다.
FriendSchema.index({
a.b : 1 // a라는 서브 도큐먼트에 있는 b라는 값
// a : { b: string}
});
2. 기본 인덱스 응용
2.1 유니크 인덱스
이런식으로 걸어주면 userId, targetUserId가 중복되지 않는다.
FriendSchema.index(
{
userId: 1,
targetUserId: 1,
},
{ unique: true }
);
2.2 특정 조건에만 인덱스
특정 조건에만 인덱스를 줄 수도 있다. 이렇게하면 인덱스에 사용되는 공간을 줄일 수 있다.
FriendSchema.index(
{
userId: 1,
targetUserId: 1,
},
{ category : {$eq: "약간 어색한 사이" }
);
2.3 Sparse Index, Dense Index
몽고DB 인덱스에서는 dense한 인덱스와 sparse한 인덱스가 있다. dense은 빽뺵스, sparse는 널널스인데 dense한 인덱스는 해당 엔트리(일종의 컬럼) 값이 없더라도 인덱스를 생성하는 것을 말한다. 즉 null에 대한 인덱스를 생성한다는 것이다. 경우에 따라 이런부분은 용량 낭비 일 수 있다. sparse는 null에 대한 인덱스를 생성하지 않는다. 디폴트는 dense한 인덱스 생성이고 아래와 같은 설정으로 sparse하게 만들어 줄 수 있다. 입 맛에 맞춰 사용하길 바란다.
FriendSchema.index(
{
userId: 1,
},
{sparse: true }
);
'Web Programming > NestJS' 카테고리의 다른 글
[NestJS] Swagger에서 refs 안될 때 (0) | 2022.08.22 |
---|---|
[NestJS] Mongoose Cache 적용 (0) | 2022.04.25 |
[NestJS] AWS Elastic BeanStalk 배포 (0) | 2022.02.23 |
[NestJS] string을 mongo ObjectId로 변경하기 (0) | 2022.02.23 |
[NestJS] mongoose 다른 이름으로 populate하기 (0) | 2022.02.14 |