오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Web Programming/NestJS

[mongoose] 인덱스 생성 그런데 이제 NestJS에서

junha6316 2022. 2. 23. 22:21

Mongodb index 생성 방법 정리해둔다. NestJS Mongoose 설정 방법은 아래 글을 참조하길 바란다.

https://cocook.tistory.com/183

 

[NestJS] NestJS에서 MongoDB 연결하기

2020.12.12 - [Language/Javascript] - [Node.js] MongoDB Mac에서 brew로 다운받고 Node.js로 연결하기 [Node.js] MongoDB Mac에서 brew로 다운받고 Node.js로 연결하기 Node.js + Mongodb 조합을 많이 사용한다..

cocook.tistory.com

아래처럼 생긴 모델일 때 인덱스 생성하기

@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 }
);