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 컬렉션 에 생성합니다.

클래스에 대해 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 모델을 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 옵션을 지정하여 내장된 문서 내의 필드를 인덱스 할 수 있습니다.

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

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 자세히 학습 장고 문서에서 를 참조하세요.

돌아가기

데이터 모델링

이 페이지의 내용