Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
장고 MongoDB 백엔드
/

생성 인덱스

이 가이드 에서는 Django 모델을 사용하여 MongoDB 인덱스를 생성하는 방법을 학습 수 있습니다. 인덱스는 쿼리의 효율성 높이고 추가 쿼리 및 문서 저장 기능을 제공할 수 있습니다.

인덱스가 없으면 MongoDB 컬렉션 의 모든 문서 스캔하여 쿼리 와 일치하는 문서를 찾아야 합니다. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 그러나 쿼리 에 대한 적절한 인덱스 있는 경우 MongoDB 인덱스 사용하여 검사하는 문서를 제한할 수 있습니다.

장고는 모델에 인덱스 생성하는 데 사용할 수 있는 Index 클래스를 제공합니다. 장고 MongoDB 백엔드는 모델이 나타내는 것과 동일한 인덱스 MongoDB 컬렉션 에 생성합니다.

To learn more about the Index class, see Index in the Django documentation.

이 가이드 의 예제에서는 내장된 Nutrition 모델을 nutrition 필드 의 값으로 포함하는 Recipe 모델을 사용합니다. 이러한 모델 클래스에는 다음과 같은 정의가 있습니다.

from django.db import models
from django.db.models import Q, F
from django_mongodb_backend.models import EmbeddedModel
from django_mongodb_backend.fields import EmbeddedModelField, ArrayField
class Nutrition(EmbeddedModel):
calories = models.IntegerField(default=0)
carb_grams = models.IntegerField(default=0)
protein_grams = models.IntegerField(default=0)
class Recipe(models.Model):
title = models.CharField(max_length=200)
cuisine = models.CharField(max_length=200)
cook_time = models.IntegerField(default=0)
allergens = ArrayField(models.CharField(max_length=100), null=True, blank=True)
nutrition = EmbeddedModelField(Nutrition, null=True, blank=True)
class Meta:
db_table = "recipes"
def __str__(self):
return self.title

Recipe 모델의 Meta 클래스에서 db_table = "recipes" 옵션은 Django MongoDB 백엔드가 Recipe 모델을 recipes라는 MongoDB 컬렉션 에 매핑하도록 지시합니다. 모델을 사용하여 MongoDB 컬렉션과 상호 작용 하는 Django 애플리케이션 만드는 방법을 학습하려면 시작하기 튜토리얼을 참조하세요.

모델에 인덱스 만들려면 모델의 Meta 클래스에 indexes 옵션을 지정합니다. 다음 코드에 표시된 대로 이 indexes 옵션의 값을 생성하려는 인덱스 목록으로 설정합니다.

class Meta:
indexes = [
models.Index(<first index definition>),
models.Index(<second index definition>),
# add more indexes here
]

인덱스 정의하려면 models.Index() 메서드에 다음 인수를 전달합니다.

  • fields: 인덱스 할 필드 목록을 지정합니다. 이 인수는 필수입니다.

  • name: 인덱스 이름을 지정합니다. 이 인수는 선택 사항이며, 인덱스 이름을 제공하지 않으면 Django는 자동으로 인덱스 이름을 생성합니다.

  • condition: 인덱스 할 문서의 하위 집합을 지정합니다. 이 인수는 선택 사항입니다. 인수에 대해 자세히 condition 학습 이 가이드 의 부분 인덱스 섹션을 참조하세요.

데이터베이스 마이그레이션을 적용 후 장고 MongoDB 백엔드는 MongoDB 컬렉션 에 동일한 인덱스를 생성합니다.

데이터베이스 마이그레이션을 생성하고 적용 방법을 학습 Django 설명서에서 마이그레이션을 참조하세요.

이 섹션에서는 다음과 같은 인덱스 유형을 생성하는 방법을 보여줍니다.

단일 필드 인덱스는 컬렉션 에 있는 단일 필드 의 정보를 저장 . 기본값 으로 모든 MongoDB 컬렉션에는 _id 필드 에 대한 인덱스 있습니다.

다음 예시 Recipe 모델의 Meta 클래스를 업데이트하여 title 필드 에 단일 필드 인덱스 생성하며, 이 인덱스는 장고 MongoDB 백엔드가 recipes 컬렉션 에 생성합니다.

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["title"], name="title_idx"),
]

또는 다음 코드에 표시된 대로 모델의 title 필드 에 db_index 옵션을 설정하다 인덱스 를 만들 수 있습니다.

class Recipe(models.Model):
title = models.CharField(max_length=200, db_index=True)

복합 인덱스는 컬렉션 의 여러 필드에서 데이터를 수집하고 정렬합니다. MongoDB 인덱스 에 지정된 첫 번째 필드 기준으로 데이터를 그룹화한 다음 각 후속 필드 기준으로 그룹화합니다.

다음 예시 Recipe 모델의 Meta 클래스를 업데이트하여 titlecook_time 필드에 복합 인덱스 생성하고, Django MongoDB 백엔드가 recipes 컬렉션 에 생성합니다.

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["title", "cook_time"]),
]

멀티키 인덱스는 배열 필드에서 데이터를 수집하고 정렬합니다. 배열 필드 에 인덱스 생성하면 MongoDB 자동으로 해당 인덱스 멀티키 인덱스 로 설정합니다.

다음 예시 Recipe 모델의 Meta 클래스를 업데이트하여 allergens 배열 필드 에 복합 인덱스 생성하며, 이 필드는 장고 MongoDB 백엔드가 recipes 컬렉션 에 생성합니다.

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["allergens"], name="allergy_idx"),
]

MongoDB 내장된 문서로 나타내는 내장된 모델 값을 저장 필드에 인덱스를 생성할 수 있습니다.

다음 예시 Recipe 모델의 Meta 클래스를 업데이트하여 nutrition 임베딩된 모델 필드 에 인덱스 생성하며, 이 인덱스는 장고 MongoDB 백엔드가 recipes 컬렉션 에 생성합니다.

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["nutrition"]),
]

중요

앞의 예시 에서 만든 인덱스 내장된 문서 전체를 지정하는 쿼리에서만 사용됩니다. 내장된 문서 내의 특정 필드 에 대한 쿼리는 인덱스 사용하지 않습니다. 그러나 Nutrition 모델에 내부 Meta 클래스를 추가하고 indexes 옵션을 지정하여 내장된 문서 내의 필드를 인덱스 할 수 있습니다.

이 섹션에서는 다음과 같은 고급 인덱스 유형을 생성하는 방법을 보여줍니다.

부분 인덱스는 지정된 필터하다 기준을 충족하는 컬렉션 의 문서만 인덱스 저장 사용 및 성능 비용이 절감됩니다.

부분 인덱스 만들려면 condition 인수를 models.Index() 메서드에 전달합니다. 조건 값을 필터하다 기준을 포함하는 Q 객체 로 설정합니다. condition 인수를 사용하는 경우 name 인수도 models.Index()에 전달해야 합니다.

Q 객체에 대해 Q 자세히 학습 장고 문서에서 를 참조하세요.

다음 예시 Recipe 모델의 Meta 클래스를 업데이트하여 cuisine 필드 에 부분 인덱스 생성하고, cook_time 값이 30 미만인 문서만 인덱스 장고 MongoDB 백엔드에 지시합니다.

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["cuisine"],
condition=Q(cook_time__lt=30),
name="fast_cuisine_idx"),
]

고유 인덱스를 사용하면 인덱싱된 필드가 중복 값을 저장하지 않도록 할 수 있습니다. 단일 필드 에서 고유 인덱스를 사용하면 지정된 필드 에 대해 값이 최대 한 번만 표시됩니다. 여러 필드에서 고유 인덱스는 지정된 인덱스 키 값 조합이 최대 한 번만 표시되도록 합니다.

다음 예시 Recipe 모델의 cuisine 필드 업데이트하고 unique 옵션을 True 로 설정하여 고유한 단일 필드 인덱스 생성합니다.

cuisine = models.CharField(max_length=200, unique=True)

참고

unique 옵션을 True 로 설정하면 지정된 필드 에 자동으로 인덱스 생성됩니다.

다음 예시 Recipe 모델의 Meta 클래스를 업데이트하여 titlecuisine 필드에 복합 인덱스 생성합니다. 이 코드는 constraints 옵션을 UniqueConstraint 인스턴스 로 설정하여 이러한 필드에 고유한 복합 인덱스 생성합니다.

class Meta:
db_table = "recipes"
constraints = [
models.UniqueConstraint(fields=["title", "cuisine"],
name="unique_regional_meal"),
]

옵션을 로 설정하면 지정된 constraints 필드에 인덱스 자동으로 생성됩니다.UniqueConstraint Meta 클래스의 constraint 옵션에 대해 자세히 학습 장고 문서에서 제약 조건을 참조하세요.

이 가이드 에 언급된 인덱스 유형에 대해 자세히 학습 다음 MongoDB Server 매뉴얼 리소스를 참조하세요.

장고 모델에서 인덱스를 생성하는 방법에 대해 Index 자세히 학습 장고 문서에서 를 참조하세요.

돌아가기

데이터 모델링

이 페이지의 내용