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 읽기 또는 쓰기 (write) 작업에서 문서를 일치시키는 데 사용하는 검색 기준을 지정하는 표현식 입니다. 쿼리 필터하다 에서는 Django MongoDB 백엔드에 쿼리 와 정확히 일치하는 문서를 검색 하도록 프롬프트를 표시하거나 쿼리 필터를 작성하여 보다 복잡한 일치 기준을 Express 수 있습니다.

장고 QuerySet API 모델 객체를 조회 할 수 있는 메서드를 제공합니다. MongoDB database 쿼리 실행 하려면 모델 관리자에서 QuerySet 메서드를 호출합니다. Manager 클래스는 데이터베이스 작업을 처리하고 Django 모델을 참조하여 MongoDB 데이터와 상호 작용 있도록 합니다. 기본값 으로 Django는 모든 모델 클래스에 objects 라는 이름의 Manager 를 추가합니다.

변수에 QuerySet 을(를) 할당하면 Django MongoDB 백엔드는 변수를 평가할 때까지 작업을 수행하지 않습니다. QuerySet를 평가한 후 Django는 쿼리 결과를 QuerySet 캐시 에 저장합니다. QuerySet 의 향후 평가에서는 캐시된 결과를 사용합니다.

장고 QuerySet API 에 대해 QuerySet 자세히 학습 장고 문서에서 를 참조하세요.

Movie 가이드 의 sample_mflix.movies 예제에서는 Atlas 샘플 데이터 세트의 컬렉션 나타내는 모델을 사용합니다. Movie 모델에는 awards 필드 값으로 임베디드 Award 모델이 포함되어 있습니다. 이러한 모델 클래스에는 다음과 같은 정의가 있습니다.

from django.db import models
from django_mongodb_backend.models import EmbeddedModel
from django_mongodb_backend.fields import EmbeddedModelField, ArrayField
class Award(EmbeddedModel):
wins = models.IntegerField(default=0)
nominations = models.IntegerField(default=0)
text = models.CharField(max_length=100)
class Movie(models.Model):
title = models.CharField(max_length=200)
plot = models.TextField(blank=True)
runtime = models.IntegerField(default=0)
released = models.DateTimeField("release date", null=True, blank=True)
awards = EmbeddedModelField(Award)
genres = ArrayField(models.CharField(max_length=100), null=True, blank=True)
imdb = models.JSONField(null=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

Movie 모델에는 모델 메타데이터 지정하는 내부 Meta 클래스와 모델의 문자열 표현을 정의하는 __str__() 메서드가 포함되어 있습니다. 이러한 모델 기능에 대해 학습 모델 생성 가이드 의모델 정의를 참조하세요.

Python 대화 셸 사용하여 코드 예제를 실행 수 있습니다. 셸 에 들어가려면 프로젝트의 루트 디렉토리 에서 다음 명령을 실행 .

python manage.py shell

Python 셸 입력한 후 다음 모델 및 모듈을 가져와야 합니다.

from <your application name>.models import Movie, Award
from django.utils import timezone
from datetime import datetime

Movie 모델과 Python 인터랙티브 셸 사용하여 MongoDB 문서와 상호 작용 장고 애플리케이션 만드는 방법을 학습하려면 시작하기 튜토리얼을 참조하세요.

MongoDB 데이터를 쿼리 하려면 모델 관리자에서 QuerySet 메서드를 호출하고 쿼리 필터하다 에 일치 기준을 지정합니다.

이 섹션에서는 QuerySet API 에서 다음 메서드를 사용하는 방법을 설명합니다.

컬렉션 에서 모든 문서를 조회 하려면 모델 관리자에서 all() 메서드를 호출합니다.

다음 예시 all() 메서드를 호출하여 sample_mflix.movies 컬렉션 의 모든 문서를 조회 .

Movie.objects.all()
<QuerySet [<Movie: The Great Train Robbery>, <Movie: A Corner in Wheat>,
<Movie: Winsor McCay, the Famous Cartoonist of the N.Y. Herald and His Moving Comics>,
<Movie: Traffic in Souls>, <Movie: Gertie the Dinosaur>,
<Movie: In the Land of the Head Hunters>, <Movie: The Perils of Pauline>,
<Movie: The Italian>, <Movie: Regeneration>, <Movie: Civilization>,
'...(remaining elements truncated)...']>

기준의 설정하다 과 일치하는 문서에 대한 컬렉션 쿼리 하려면 모델 관리자에서 filter() 메서드를 호출합니다. 쿼리 기준을 지정하는 filter() 메서드에 쿼리 필터하다 전달합니다.

다음 예시 filter() 메서드를 호출하여 sample_mflix.movies 컬렉션 에서 runtime 값이 300인 문서를 쿼리 .

Movie.objects.filter(runtime=300)
<QuerySet [<Movie: Wild Palms>, <Movie: Streets of Laredo>,
<Movie: The Way We Live Now>]>

컬렉션 에서 하나의 문서 조회 하려면 모델 관리자에서 get() 메서드를 호출합니다. 쿼리 기준을 지정하는 get() 메서드에 쿼리 필터하다 전달합니다.

중요

쿼리 일치하는 문서가 없거나 여러 문서와 일치하는 경우 get() 메서드는 오류를 생성합니다. 여러 문서와 일치할 수 있는 쿼리 에서 하나 문서 조회 하려면 first() 메서드를 사용합니다.

다음 예시 get() 메서드를 호출하여 title 값이 "Finding Nemo"인 문서 하나를 조회 합니다.

Movie.objects.get(title="Finding Nemo")
<Movie: Finding Nemo>

검색 기준을 충족하지 않는 문서에 대한 컬렉션 쿼리 하려면 모델 관리자에서 exclude() 메서드를 호출합니다. 제외 기준을 exclude() 메서드에 인수로 전달합니다.

다음 예시 exclude() 메서드를 호출하여 datetime(1980, 1, 1) (1, 1980) 이전에 릴리스된 문서를 결과에서 제외합니다.

Movie.objects.exclude(released__lt=timezone.make_aware(datetime(1980, 1, 1)))
<QuerySet [<Movie: The Iron Horse>, <Movie: Le grand jeu>,
<Movie: The Devil Is a Woman>, <Movie: Children in the Wind>,
<Movie: Too Much Johnson>, <Movie: Dots>, <Movie: The Blood of Jesus>,
<Movie: The Land>, <Movie: The Brothers and Sisters of the Toda Family>,
<Movie: Begone Dull Care>, '...(remaining elements truncated)...']>

앞의 예시 에서는 lt 필드 조회를 사용하여 컬렉션 쿼리 . 비교 조회에 대해 자세히 학습 이 가이드 의 비교 조회 사용 섹션을 참조하세요.

장고의 쿼리 API 지원 하지 않는 복잡한 쿼리를 실행 하려면 raw_aggregate() 메서드를 사용하면 됩니다. 이 메서드를 사용하면 raw_aggregate()에 인수로 전달하는 MongoDB 집계 파이프라인 에서 쿼리 기준을 지정할 수 있습니다.

원시 데이터베이스 쿼리를 실행 방법을 학습 원시 데이터베이스 쿼리 수행 가이드 참조하세요.

쿼리 필터하다 에서 필드 조회를 사용하여 쿼리 기준을 더욱 세분화할 수 있습니다. 필드 조회를 사용하면 쿼리하려는 필드 와 쿼리 하려는 값 간의 관계 명확히 할 수 있습니다. 필드 조회를 지정하려면 다음 구문을 사용합니다.

Model.objects.filter(<field name>__<lookup type>=<value>)

다양한 조회 유형을 사용하여 날짜/시간 필드에 대한 부분 텍스트 일치, 배열 요소 쿼리, 정규 표현식 일치, 연도 값 일치와 같은 고급 쿼리를 수행할 수 있습니다.

조회 유형의 전체 목록을 보려면 QuerySet 장고 API 참조에서 필드 조회를 참조하세요.

이 섹션에서는 다음과 같은 방법으로 쿼리 필터를 구체화하는 방법을 설명합니다.

다음 표에서는 텍스트 값에 대한 특정 일치 기준이 포함된 쿼리를 실행 데 사용할 수 있는 몇 가지 조회 유형에 대해 설명합니다.

조회 유형
설명

exact

Specifies an exact text match. If you do not provide a lookup type in your query filter, Django MongoDB Backend uses this type by default.
You can specify a case-insensitive exact text match by using iexact.

contains

Specifies a partial text match.
You can specify a case-insensitive partial text match by using icontains.

startswith

Matches field values that begin with the specified text.
You can specify a case-insensitive partial text match by using istartswith.

endswith

Matches field values that end with the specified text.
You can specify a case-insensitive partial text match by using iendswith.

다음 예시 contains 조회를 사용하여 plot 값에 "coming-of-age" 텍스트가 포함된 문서를 쿼리 합니다.

Movie.objects.filter(plot__contains="coming-of-age")
<QuerySet [<Movie: Murmur of the Heart>, <Movie: Desert Bloom>,
<Movie: Girls Town>, <Movie: Get Real>, <Movie: Man of Steel>,
<Movie: The Holy Land>, <Movie: Secondhand Lions>, <Movie: How to Be Louise>,
<Movie: Mouth to Mouth>, <Movie: Che ne sarè di noi>, <Movie: Roll Bounce>,
'...(remaining elements truncated)...']>

다음 표에서는 지정된 값에 대해 필드 값을 평가하는 쿼리를 실행 데 사용할 수 있는 몇 가지 조회 유형에 대해 설명합니다.

조회 유형
설명

gt

Matches field values that are greater than the specified value.

gte

Matches field values that are greater than or equal to the specified value.

lt

Matches field values that are less than the specified value.

lte

Matches field values that are less or equal to than the specified value.

다음 예시 lte 조회를 사용하여 runtime 값이 50보다 작거나 같은 문서를 쿼리 합니다.

Movie.objects.filter(runtime__lte=50)
<QuerySet [<Movie: The Great Train Robbery>, <Movie: A Corner in Wheat>,
<Movie: Winsor McCay, the Famous Cartoonist of the N.Y. Herald and His Moving Comics>,
<Movie: Gertie the Dinosaur>, <Movie: From Hand to Mouth>,
<Movie: High and Dizzy>, <Movie: One Week>, <Movie: Now or Never>,
'...(remaining elements truncated)...']>

다음과 같은 방법으로 여러 일치 기준 세트를 사용하는 쿼리를 실행 수 있습니다.

Q 객체를 사용하여 여러 세트의 일치 기준으로 쿼리를 실행 수 있습니다. Q 객체 만들려면 쿼리 필터하다 Q() 메서드에 전달합니다. 여러 Q 객체를 쿼리 메서드에 인수로 전달하고 각 Q 객체 OR(|), AND(&) 또는 XOR(^) 연산자 로 구분할 수 있습니다. ~ 기호를 접두사로 붙여 Q 객체를 무효화할 수도 있습니다.

이 예시 Q 객체를 사용하여 다음 쿼리 조건을 충족하는 문서를 쿼리 .

  • title 필드 값이 "Funny" 또는 "Laugh"텍스트로 시작합니다.

  • genres 배열 필드 값이 포함되어 있지 않습니다. "Comedy"

Movie.objects.filter(
(Q(title__startswith="Funny") | Q(title__startswith="Laugh"))
& ~Q(genres__contains=["Comedy"])
)
<QuerySet [<Movie: Laugh, Clown, Laugh>, <Movie: Funny Games>]>

앞의 예시 ArrayField 값에 대한 필드 조회를 사용합니다. 쿼리에 대한 ArrayField 자세한 내용은 이 가이드 의 ArrayField 쿼리 섹션을 참조하세요.

이 섹션에서는 다음과 같은 방법으로 쿼리 결과를 수정하는 방법에 대해 설명합니다.

order_by() 메서드를 사용하여 쿼리 결과에 대한 정렬 순서를 제공할 수 있습니다. 지정된 필드 의 값을 기준으로 오름차순 정렬을 지정하려면 필드 이름을 인수로 전달합니다. 내림차순 정렬을 지정하려면 빼기 기호(-) 접두사가 붙은 필드 이름을 인수로 전달합니다.

쉼표로 구분하여 여러 필드 이름을 order_by() 메서드에 전달할 수 있습니다. Django MongoDB 백엔드는 각 필드 기준으로 제공된 순서대로 결과를 정렬합니다.

이 예에서는 다음 조치를 수행합니다.

  • Movie 모델의 관리자에서 filter() 메서드를 호출하여 sample_mflix.movies 컬렉션 쿼리 .

  • 텍스트 "Rocky"로 시작하는 title 값을 가진 문서를 쿼리합니다.

  • 결과를 released 필드 값의 오름차순으로 정렬합니다.

Movie.objects.filter(title__startswith="Rocky").order_by("released")
<QuerySet [<Movie: Rocky>, <Movie: Rocky II>, <Movie: Rocky III>,
<Movie: Rocky IV>, <Movie: Rocky V>, <Movie: Rocky Marciano>,
<Movie: Rocky Balboa>]>

다음 코드와 같이 Python의 배열 슬라이싱 구문을 사용하여 쿼리 반환하는 결과 수를 지정할 수 있습니다.

Model.objects.filter(<query filter>)[<start>:<end>]

<start><end> 자리 표시자를 반환하려는 결과의 하위 집합을 나타내는 정수 값으로 바꿉니다. 시작 값은 배타적이며 끝 값은 포괄적입니다.

<start> 값을 생략하면 쿼리 첫 번째 일치 항목부터 시작하여 <end> 값으로 지정된 숫자를 반환할 때까지 각 결과를 반환합니다.

<end> 값을 생략하면 쿼리 각 결과를 반환하지만 <start>에서 지정한 초기 결과 수를 건너뜁니다.

이 예에서는 다음 조치를 수행합니다.

  • Movie 모델의 관리자에서 filter() 메서드를 호출하여 sample_mflix.movies 컬렉션 쿼리 .

  • released 값이 datetime(2010, 7, 16)인 문서를 쿼리합니다(16, 2010 7월)

  • 세 번째 및 네 번째 결과를 반환합니다.

Movie.objects.filter(released=timezone.make_aware(datetime(2010, 7, 16)))[2:4]
<QuerySet [<Movie: Inception>, <Movie: Winter's Bone>]>

여러 결과와 일치할 수 있는 쿼리 에서 첫 번째 결과를 조회 하려면 first() 메서드를 filter() 메서드에 연결합니다. 쿼리 기준을 지정하는 filter() 메서드에 쿼리 필터하다 전달합니다.

다음 예시 filter()first() 메서드를 호출하여 sample_mflix.movies 컬렉션 에서 genres 값이 ["Crime", "Comedy"]인 첫 번째 문서 를 쿼리 .

Movie.objects.filter(genres=["Crime", "Comedy"]).first()
<Movie: The Crew>

이 섹션에서는 다음 필드 유형에 대해 쿼리를 실행 방법에 대해 설명합니다.

모델에서 임베디드 모델의 필드를 쿼리 작업을 실행 수 있습니다. 이러한 필드를 쿼리 하려면 다음 코드와 같이 쿼리 하려는 필드 에 도달할 때까지 모델 필드 와 각 임베디드 필드 이름을 이중 밑줄(__)로 구분하여 지정합니다.

Model.objects.filter(<model field>__<embedded model field>=<value>)

필드 조회를 사용하여 임베디드 모델 쿼리 구체화할 수도 있습니다. 쿼리하려는 임베디드 모델 필드 뒤에 이중 밑줄 접두사가 붙은 조회 유형을 추가합니다.

이 예시 조회를 사용하여 Movie 모델에 포함된 Award 모델을 쿼리 . 이 임베디드 모델은 sample_mflix.movies 컬렉션 의 awards 필드 와 중첩된 wins, nominationstext 필드를 나타냅니다. 다음 코드는 awards.wins 중첩 필드 값이 150보다 큰 문서를 쿼리합니다.

Movie.objects.filter(awards__wins__gt=150)
<QuerySet [<Movie: The Lord of the Rings: The Return of the King>,
<Movie: No Country for Old Men>, <Movie: Slumdog Millionaire>,
<Movie: Boyhood>, <Movie: The Social Network>, <Movie: Inception>,
<Movie: Gravity>, <Movie: Gravity>, <Movie: The Artist>,
<Movie: 12 Years a Slave>, <Movie: Birdman: Or (The Unexpected Virtue of Ignorance)>]>

표준 쿼리 구문을 사용하여 ArrayField 값에 저장된 데이터를 쿼리 할 수 있습니다. 장고 MongoDB 백엔드는 ArrayField 값을 쿼리하기 위한 추가 필드 조회 유형을 제공하며, 이에 대한 설명은 다음 표에 설명되어 있습니다.

조회 유형
설명

contains

Matches fields that store the provided value as a subset of their data. This ArrayField lookup overrides the contains lookup described in the Use Text Match Lookups section of this guide.

contained_by

Matches fields that store a subset of the provided values. This lookup type is the inverse of contains.

overlap

Matches field that store any of the provided values.

len

Matches fields that store the number of values provided.

다음 예시 overlap 조회를 사용하여 genres 필드 에 ["Adventure", "Family"] 배열 의 값이 포함된 문서를 쿼리 .

Movie.objects.filter(genres__overlap=["Adventure", "Family"])
<QuerySet [<Movie: The Poor Little Rich Girl>, <Movie: Robin Hood>,
<Movie: Peter Pan>, <Movie: The Thief of Bagdad>, <Movie: Clash of the Wolves>,
<Movie: Beau Geste>, <Movie: The Black Pirate>, <Movie: The Son of the Sheik>,
<Movie: Steamboat Willie>, <Movie: The Big Trail>, <Movie: The Champ>,
'...(remaining elements truncated)...']>

EmbeddedModelField 쿼리하기 섹션에 표시된 것과 동일한 구문을 사용하여 값에 저장된 데이터를 쿼리 할 수 JSONField 있습니다. 쿼리 하려는 필드 도달할 때까지 각 필드 와 중첩된 필드 이름을 이중 밑줄(__)로 구분하여 함께 연결합니다.

다음 예시 JSONFieldimdb 필드 900000를 초과하는 중첩된 votes 필드 의 값을 쿼리합니다.

Movie.objects.filter(imdb__votes__gt=900000)
<QuerySet [<Movie: La nao capitana>, <Movie: The Godfather>,
<Movie: This Is Spinal Tap>, <Movie: Forrest Gump>, <Movie: Pulp Fiction>,
<Movie: The Shawshank Redemption>, <Movie: Se7en>,
<Movie: The Lord of the Rings: The Fellowship of the Ring>,
<Movie: The Matrix>, <Movie: Fight Club>,
<Movie: The Lord of the Rings: The Return of the King>,
<Movie: The Lord of the Rings: The Two Towers>, <Movie: The Shawshank Redemption>,
<Movie: Landet som icke èr>, <Movie: The Dark Knight>,
<Movie: The Danish Girl>, <Movie: The Dark Knight Rises>, <Movie: Inception>,
<Movie: Catching the Sun>, <Movie: Scouts Guide to the Zombie Apocalypse>,
'...(remaining elements truncated)...']>

KT() 표현식을 사용하여 JSONField 값에 저장된 데이터에 주석을 달고 필터하다 할 수 있습니다. KT() 표현식을 사용하면 JSONField 내에서 키, 인덱스 또는 경로 변환의 텍스트 값으로 작업할 수 있습니다. KT() 표현식 annotate() 메서드에 전달하면 제공된 KT() 표현식으로 QuerySet 의 각 객체 에 주석을 답니다.

KT() 표현식과 annotate() 메서드에 대해 자세히 학습 장고 문서에서 다음 리소스를 참조하세요.

다음 예시 annotate()KT() 를 사용하여 imdb.rating 중첩 필드 값을 저장하는 새 score 키를 만듭니다. 그런 다음 코드는 sample_mflix.movies 컬렉션 의 각 문서 내림차순 score 값을 기준으로 정렬합니다.

from django.db.models.fields.json import KT
Movie.objects.annotate(score=KT("imdb__rating")).all().order_by("-score")
<QuerySet [<Movie: No Tomorrow>, <Movie: The Deposit>, <Movie: Man Down>,
<Movie: Convenience>, <Movie: Scouts Guide to the Zombie Apocalypse>,
<Movie: Another World>, <Movie: The Danish Girl>, <Movie: Ad Inexplorata>,
<Movie: Landet som icke èr>, <Movie: The Ghost and the Whale>,
<Movie: Coming to Terms>, <Movie: La nao capitana>, <Movie: All Eyes and Ears>,
<Movie: Catching the Sun>, <Movie: Manhattan Romance>, <Movie: Anomalisa>,
<Movie: Outliving Emily>, <Movie: Mary Loss of Soul>,
<Movie: The Childhood of a Leader>, <Movie: Krot na more>,
'...(remaining elements truncated)...']>

pk 조회 단축키를 사용하여 MongoDB ObjectId 값으로 저장하는 기본 키 값을 쿼리 할 수 있습니다.

다음 예시 기본 키 ObjectId("573a1394f29313caabce0d37")인 문서 에 대해 sample_mflix.movies 컬렉션 쿼리합니다.

from bson import ObjectId
Movie.objects.get(pk=ObjectId("573a1394f29313caabce0d37"))
// Your ObjectId values might differ
<Movie: Vertigo>

sample_mflix.movies 컬렉션 나타내는 Movie 모델은 id 필드 기본 키 사용합니다. 다음 예시 id 필드 사용하여 이전 코드와 동일한 쿼리 구성합니다.

from bson import ObjectId
Movie.objects.get(id=ObjectId("573a1394f29313caabce0d37"))

MongoDB의 집계 파이프라인 구문을 사용하여 원시 데이터베이스 쿼리를 실행 방법을 학습 원시 데이터베이스 쿼리 수행 가이드 참조하세요.

다른 QuerySet 작업을 수행하는 방법을 학습 CRUD 작업 수행 가이드 참조하세요.

장고 쿼리에 대해 자세히 학습 장고 문서에서 쿼리 만들기를 참조하세요.

돌아가기

CRUD 작업