개요
이 가이드 에서는 Django 모델을 사용하여 MongoDB 인덱스를 생성하는 방법을 학습 수 있습니다. 인덱스는 쿼리의 효율성 높이고 추가 쿼리 및 문서 저장 기능을 제공할 수 있습니다.
인덱스가 없으면 MongoDB 컬렉션 의 모든 문서 스캔하여 쿼리 와 일치하는 문서를 찾아야 합니다. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 그러나 쿼리 에 대한 적절한 인덱스 있는 경우 MongoDB 인덱스 사용하여 검사하는 문서를 제한할 수 있습니다.
장고는 모델에 인덱스 생성하는 데 사용할 수 있는 Index
클래스를 제공합니다. 장고 MongoDB 백엔드는 모델이 나타내는 것과 동일한 인덱스 MongoDB 컬렉션 에 생성합니다.
팁
클래스에 대해 Index
자세히 학습 장고 문서에서 를 참조하세요.Index
샘플 데이터
이 가이드 의 예제에서는 내장된 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 from django_mongodb_backend.indexes import SearchIndex, VectorSearchIndex 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) ratings = ArrayField(models.IntegerField(default=0), size=10) 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
모델을 라는 MongoDB 컬렉션 에 매핑하도록 recipes
지시합니다. 모델을 사용하여 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
옵션을 지정하여 내장된 문서 내의 필드를 인덱스 할 수 있습니다.
고급 인덱스 구성
이 섹션에서는 다음과 같은 고급 인덱스 유형을 생성하는 방법을 보여줍니다.
Atlas search 인덱스
Atlas Search 인덱스는 MongoDB Atlas 에서 호스팅되는 컬렉션에 대한 전체 텍스트 검색 인 Atlas Search 의 동작을 지정합니다.
Atlas Search 인덱스 만들려면 모델의 Meta
클래스에 있는 indexes
옵션을 SearchIndex
객체 에 할당합니다. 다음 인수를 SearchIndex()
생성자에 전달합니다.
fields
: 인덱스 할 필드입니다.name
: (선택 사항) Atlas Search 인덱스 의 이름입니다. 이 인수를 지정하지 않으면 Django는 자동으로 인덱스 이름을 생성합니다.
다음 예시 Recipe
모델의 Meta
클래스를 업데이트하여 title
필드 에 "title_search_idx"
라는 이름의 Atlas Search 인덱스 만듭니다.
class Meta: db_table = "recipes" indexes = [ SearchIndex( fields=["title"], name="title_search_idx", ) ]
팁
Atlas Search 쿼리 및 인덱스에 대해 자세히 학습 다음 리소스를 참조하세요.
Atlas 문서의 Atlas Search .
Django MongoDB 백엔드 API 문서의SearchIndex 클래스.
Atlas Vector Search 인덱스
Atlas Vector Search 인덱스를 사용하면 키워드 일치가 아닌 의미론적 의미를 기반으로 데이터를 쿼리 할 수 있습니다. 벡터 검색 전체 텍스트 검색 쿼리 및 AI 프레임워크와 통합하여 범위 사용 사례를 지원 수 있습니다.
벡터 검색 인덱스 만들려면 모델의 Meta
클래스에 있는 indexes
옵션을 VectorSearchIndex
객체 에 할당합니다. 다음 인수를 VectorSearchIndex()
생성자에 전달합니다.
name
: (선택 사항) Atlas Vector Search 인덱스의 이름입니다. 이 인수를 지정하지 않으면 Django는 자동으로 인덱스 이름을 생성합니다.fields
: 인덱스 할 필드입니다. 하나 이상은 크기가 지정된FloatField
또는IntegerField
값의 배열로 표현되는 벡터 필드여야 합니다.similarities
: 사용할 유사성 함수 입니다."cosine"
,"dotProduct"
또는"euclidean"
유사성 함수를 사용할 수 있습니다. 함수를 단일 문자열 값 또는 개별 벡터 필드에 함수를 할당하는 값 목록으로 지정합니다.
다음 예시 Recipe
모델의 Meta
클래스를 업데이트하여 ratings
벡터 필드 와 cook_time
숫자 필드 에 "vector_search_idx"
라는 벡터 검색 인덱스 만듭니다.
class Meta: db_table = "recipes" indexes = [ VectorSearchIndex( name=["vector_search_idx"], fields=["ratings", "cook_time"], similarities=["cosine", "euclidean"], ) ]
팁
Atlas Vector Search 쿼리 및 인덱스에 대해 자세히 학습 다음 리소스를 참조하세요.
Atlas 문서의 Atlas Vector Search .
Django MongoDB 백엔드 API 문서의VectorSearchIndex 클래스.
부분 인덱스
부분 인덱스는 지정된 필터하다 기준을 충족하는 컬렉션 의 문서만 인덱스 저장 사용 및 성능 비용이 절감됩니다.
부분 인덱스 만들려면 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
자세히 학습 장고 문서에서 를 참조하세요.