Docs Menu
Docs Home
/ / /
장고 MongoDB 백엔드
/

생성 인덱스

이 가이드 에서는 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 클래스를 업데이트하여 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 옵션을 지정하여 내장된 문서 내의 필드를 인덱스 할 수 있습니다.

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

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 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 쿼리 및 인덱스에 대해 자세히 학습 다음 리소스를 참조하세요.

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

부분 인덱스 만들려면 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 자세히 학습 장고 문서에서 를 참조하세요.

돌아가기

데이터 모델링

이 페이지의 내용