개요
이 가이드 에서는 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
클래스를 업데이트하여 title
및 cook_time
필드에 복합 인덱스 생성하고, Django MongoDB 백엔드가 recipes
컬렉션 에 생성합니다.
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["title", "cook_time"]), ]
Multikey Index
멀티키 인덱스는 배열 필드에서 데이터를 수집하고 정렬합니다. 배열 필드 에 인덱스 생성하면 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"), ]
Unique Indexes
고유 인덱스를 사용하면 인덱싱된 필드가 중복 값을 저장하지 않도록 할 수 있습니다. 단일 필드 에서 고유 인덱스를 사용하면 지정된 필드 에 대해 값이 최대 한 번만 표시됩니다. 여러 필드에서 고유 인덱스는 지정된 인덱스 키 값 조합이 최대 한 번만 표시되도록 합니다.
단일 필드 예시
다음 예시 Recipe
모델의 cuisine
필드 업데이트하고 unique
옵션을 True
로 설정하여 고유한 단일 필드 인덱스 생성합니다.
cuisine = models.CharField(max_length=200, unique=True)
참고
unique
옵션을 True
로 설정하면 지정된 필드 에 자동으로 인덱스 생성됩니다.
컴파운드 예시
다음 예시 Recipe
모델의 Meta
클래스를 업데이트하여 title
및 cuisine
필드에 복합 인덱스 생성합니다. 이 코드는 constraints
옵션을 UniqueConstraint
인스턴스 로 설정하여 이러한 필드에 고유한 복합 인덱스 생성합니다.
class Meta: db_table = "recipes" constraints = [ models.UniqueConstraint(fields=["title", "cuisine"], name="unique_regional_meal"), ]
팁
옵션을 로 설정하면 지정된 constraints
필드에 인덱스 자동으로 생성됩니다.UniqueConstraint
Meta
클래스의 constraint
옵션에 대해 자세히 학습 장고 문서에서 제약 조건을 참조하세요.
추가 정보
이 가이드 에 언급된 인덱스 유형에 대해 자세히 학습 다음 MongoDB Server 매뉴얼 리소스를 참조하세요.
장고 모델에서 인덱스를 생성하는 방법에 대해 Index
자세히 학습 장고 문서에서 를 참조하세요.