개요
이 가이드 에서는 Django MongoDB 백엔드를 사용하여 데이터베이스 쿼리 지정하는 방법을 학습 수 있습니다.
쿼리 필터하다 만들어 쿼리 반환하는 문서 설정하다 를 구체화할 수 있습니다. 쿼리 필터하다 는 MongoDB 읽기 또는 쓰기 (write) 작업에서 문서를 일치시키는 데 사용하는 검색 기준을 지정하는 표현식 입니다. 쿼리 필터하다 에서는 Django MongoDB 백엔드에 쿼리 와 정확히 일치하는 문서를 검색 하도록 프롬프트를 표시하거나 쿼리 필터를 작성하여 보다 복잡한 일치 기준을 Express 수 있습니다.
Query API
장고 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>]>
Retrieve One Document
컬렉션 에서 하나의 문서 조회 하려면 모델 관리자에서 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 참조에서 필드 조회를 참조하세요.
이 섹션에서는 다음과 같은 방법으로 쿼리 필터를 구체화하는 방법을 설명합니다.
텍스트 일치 조회 사용
다음 표에서는 텍스트 값에 대한 특정 일치 기준이 포함된 쿼리를 실행 데 사용할 수 있는 몇 가지 조회 유형에 대해 설명합니다.
조회 유형 | 설명 |
---|---|
| 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 . |
| Specifies a partial text match. You can specify a case-insensitive partial text match
by using icontains . |
| Matches field values that begin with the specified text. You can specify a case-insensitive partial text match
by using istartswith . |
| 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)...']>
비교 조회 사용
다음 표에서는 지정된 값에 대해 필드 값을 평가하는 쿼리를 실행 데 사용할 수 있는 몇 가지 조회 유형에 대해 설명합니다.
조회 유형 | 설명 |
---|---|
| Matches field values that are greater than the
specified value. |
| Matches field values that are greater than or equal
to the specified value. |
| Matches field values that are less than the specified
value. |
| 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
객체 만들려면 쿼리 필터하다 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>
고급 필드 쿼리
이 섹션에서는 다음 필드 유형에 대해 쿼리를 실행 방법에 대해 설명합니다.
EmbeddedModelField 쿼리
모델에서 임베디드 모델의 필드를 쿼리 작업을 실행 수 있습니다. 이러한 필드를 쿼리 하려면 다음 코드와 같이 쿼리 하려는 필드 에 도달할 때까지 모델 필드 와 각 임베디드 필드 이름을 이중 밑줄(__
)로 구분하여 지정합니다.
Model.objects.filter(<model field>__<embedded model field>=<value>)
필드 조회를 사용하여 임베디드 모델 쿼리 구체화할 수도 있습니다. 쿼리하려는 임베디드 모델 필드 뒤에 이중 밑줄 접두사가 붙은 조회 유형을 추가합니다.
예시
이 예시 조회를 사용하여 Movie
모델에 포함된 Award
모델을 쿼리 . 이 임베디드 모델은 sample_mflix.movies
컬렉션 의 awards
필드 와 중첩된 wins
, nominations
및 text
필드를 나타냅니다. 다음 코드는 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 쿼리
표준 쿼리 구문을 사용하여 ArrayField
값에 저장된 데이터를 쿼리 할 수 있습니다. 장고 MongoDB 백엔드는 ArrayField
값을 쿼리하기 위한 추가 필드 조회 유형을 제공하며, 이에 대한 설명은 다음 표에 설명되어 있습니다.
조회 유형 | 설명 |
---|---|
| 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. |
| Matches fields that store a subset of the provided values.
This lookup type is the inverse of contains . |
| Matches field that store any of the provided values. |
| 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)...']>
JSONField 쿼리
EmbeddedModelField 쿼리하기 섹션에 표시된 것과 동일한 구문을 사용하여 값에 저장된 데이터를 쿼리 할 수 JSONField
있습니다. 쿼리 하려는 필드 도달할 때까지 각 필드 와 중첩된 필드 이름을 이중 밑줄(__
)로 구분하여 함께 연결합니다.
다음 예시 JSONField
값 imdb
필드 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)...']>
JSON 데이터에 주석 달기 및 필터링
KT()
표현식을 사용하여 JSONField
값에 저장된 데이터에 주석을 달고 필터하다 할 수 있습니다. KT()
표현식을 사용하면 JSONField
내에서 키, 인덱스 또는 경로 변환의 텍스트 값으로 작업할 수 있습니다. KT()
표현식 annotate()
메서드에 전달하면 제공된 KT()
표현식으로 QuerySet
의 각 객체 에 주석을 답니다.
다음 예시 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 작업 수행 가이드 참조하세요.
장고 쿼리에 대해 자세히 학습 장고 문서에서 쿼리 만들기를 참조하세요.