mongoengine Django
Document
대상은 데이터베이스에서 이 클래스와 관련된 대상에 접근하는 데 사용되는 objects
속성이 있다.이 objects
속성은 사실 QuerySetManager
이고, 새로운 QuerySet
대상의 방문을 만들고 되돌려줍니다.이 QuerySet
객체는 데이터베이스에서 검색할 수 있는 문서입니다.# Prints out the names of all the users in the database
for user in User.objects:
print user.name
질의 필터링
QuerySet
대상의 키 파라미터를 호출하여 데이터 조회를 필터할 수 있습니다. 키 조회의 키는 당신이 조회하고자 하는 Document
의 필드와 일치합니다.# This will return a QuerySet that will only iterate over users whose
# 'country' field is set to 'uk'
uk_users = User.objects(country='uk')
문서가 포함된 필드는 객체 속성 액세스 구문의
__
대신 .
를 사용하여 액세스할 수 있습니다.# This will return a QuerySet that will only iterate over pages that have
# been written by a user whose 'country' field is set to 'uk'
uk_pages = Page.objects(author__country='uk')
조회 조작부호
또한 질의에서 키워드의 이중 밑줄에 연산자를 추가하면 됩니다.
# Only find users whose age is 18 or less
young_users = Users.objects(age__lte=18)
사용 가능한 연산자는 다음과 같습니다.
ne
–같지 않다≠
lt
– 작음<
lte
– 같음≤
gt
– 크게>
gte
– 같음≥
not
- 하나의 표준을 부정하는 검사는 다른 조작부호 앞에 사용해야 한다(e.g.Q(age__not__mod=5)
)in
– list
에서 nin
– 값이 없음list
mod
–value % x == y
, 여기서 x
와y
는 주어진 값all
–list
안의 모든 값size
- 배열의 크기exists
– 이 값이 있음다음 조작부호는 정규 조회를 신속하게 진행할 수 있다.
exact
- 문자열 필드가 이 값과 완전히 일치iexact
- 문자열 필드가 이 값과 완전히 일치합니다(대소문자 민감)contains
- 문자열 필드에 이 값이 포함됩니다icontains
- 문자열 필드에 이 값(대소문자 민감)startswith
- 문자열 필드는 이 값으로 시작합니다istartswith
- 문자열 필드는 이 값으로 시작합니다(대소문자 민감)endswith
- 문자열 필드는 이 값으로 끝납니다iendswith
- 문자열 필드는 이 값으로 끝납니다(대소문자 민감)match
- $elemMatch
조작을 실행하기 때문에 하나의 그룹에 있는document 실례를 사용할 수 있습니다PASS
목록 조회
대부분의 필드에 대해 이 문법은 그 필드가 제시한 값과 일치하는 문서를 조회하지만, 한 필드가 인용
ListField
할 때 하나의 데이터만 제공하면 이 데이터를 포함하는 것은 일치한다.class Page(Document):
tags = ListField(StringField())
# This will match all pages that have the word 'coding' as an item in the
# 'tags' list
Page.objects(tags='coding')
원본 질의
__raw__
매개 변수를 통해 원시적PyMongo
문장을 사용하여 조회할 수 있습니다. 이렇게 하면 원시적인 완전한 조회를 할 수 있습니다.Page.objects(__raw__={'tags': 'coding'})
결과 제한 및 건너뛰기
전통적인 ORM처럼 되돌아오는 결과의 수량을 제한하거나 일정 수량의 결과를 뛰어넘어야 할 때가 있다.
QuerySet
에는 limit()
와 skip()
두 가지 방법으로 실현할 수 있지만 수조 절단의 문법을 사용하는 것을 추천합니다.# Only the first 5 people
users = User.objects[:5]
# All except for the first 5 people
users = User.objects[5:]
# 5 users, starting from the 11th user found
users = User.objects[10:15]
너는 조회가 결과를 되돌릴 수 있도록 지정할 수 있다.만약 이 항목이 데이터베이스에 존재하지 않는다면
IndexError
오류를 일으킬 수 있습니다.first()
방법을 사용하면 데이터가 존재하지 않을 때 되돌아온다None
:>>> # Make sure there are no users
>>> User.drop_collection()
>>> User.objects[0]
IndexError: list index out of range
>>> User.objects.first() == None
True
>>> User(name='Test User').save()
>>> User.objects[0] == User.objects.first()
True
기본값
Document
쿼리기본적으로,
Document
의 objects
속성은 하나의 QuerySet
대상을 되돌려줍니다. 모든 데이터 대상을 되돌려줍니다.이 점은 document
에 방법을 정의해서 수정할 수 있다queryset
.이 방법은 두 개의 매개 변수__doc_cls
와 queryset
가 필요하다.첫 번째 파라미터는 이 방법을 정의하는 Document
클래스(이런 의미에서 보면 이 방법은 일반적인 방법이 아닌 classmethod()
와 같고 두 번째 파라미터는 초기화된 것이다queryset
.이 방법은 그것을 장식하기 위해 queryset_manager()
를 사용해야 인정받을 수 있다.class BlogPost(Document):
title = StringField()
date = DateTimeField()
@queryset_manager
def objects(doc_cls, queryset):
# This may actually also be done by defining a default ordering for
# the document, but this illustrates the use of manager methods
return queryset.order_by('-date')
objects
방법을 사용하지 않아도 됩니다. 예를 들어 다음과 같은 관리 방법을 사용자 정의할 수 있습니다.class BlogPost(Document):
title = StringField()
published = BooleanField()
@queryset_manager
def live_posts(doc_cls, queryset):
return queryset.filter(published=True)
BlogPost(title='test1', published=False).save()
BlogPost(title='test2', published=True).save()
assert len(BlogPost.objects) == 2
assert len(BlogPost.live_posts()) == 1
사용자 정의QuerySets
네가 스스로 방법을 정의해서 필터를 하고 싶을 때
document
, 계승 QuerySet
종류는 너에게 좋은 방법이다.document
에서 사용자 정의 QuerySet
클래스를 사용하기 위해서 document
의 meta
사전에 queryset_class
값을 설정해서 그것을 실현할 수 있습니다.class AwesomerQuerySet(QuerySet):
def get_awesome(self):
return self.filter(awesome=True)
class Page(Document):
meta = {'queryset_class': AwesomerQuerySet}
# To call:
Page.objects.get_awesome()
Aggregation 집선
MongoDB는 상자를 열면 바로 사용할 수 있는 집합 방법을 제공했지만 RDBMS가 제공하는 것만큼 많지 않았다.MongoEngine은 포장된 내장된 방법을 제공하는 동시에 자체적으로 몇 가지 방법을 제공하여 데이터베이스 서비스에서 실행되는Javascript 코드의 기능을 실현했다.
결과 수
제한과 건너뛰기 결과처럼
QuerySet
대상은 계수하는 방법을 제공했다-count()
. 그러나 더 Pythonic
방법은 다음과 같다.num_users = len(User.objects)
다양한 기능
document
의 특정 필드의 수량을 계산하고 싶을 때sum()
:yearly_expense = Employee.objects.sum('salary')
한 필드의 평균을 구하려면
average()
:mean_age = User.objects.average('age')
MongoEngine은 집합에 있는 주파수
item
를 가져오는 방법을 제공했다.다음 예에서는 item_frequencies()
를 생성할 수 있습니다.class Article(Document):
tag = ListField(StringField())
# After adding some tagged articles...
tag_freqs = Article.objects.item_frequencies('tag', normalize=True)
from operator import itemgetter
top_tags = sorted(tag_freqs.items(), key=itemgetter(1), reverse=True)[:10]
쿼리 효율성 및 성능
PASS
고급 질의
때때로 키워드 파라미터를 사용하여 되돌아오는
tag-clouds
은 당신의 조회 수요를 완전히 만족시킬 수 없습니다.예를 들어 제약 조건QuerySet
,and
의 조작을 해야 할 때가 있다.MongoEngine에서 제공하는 or
클래스를 사용하면 됩니다. 하나의 Q
클래스는 하나의 검색의 일부분을 대표하며, 그 안의 매개 변수 설정은 당신이 검색한 Q
때와 같습니다.복잡한 조회를 만들 때 document
또는 &
조작부호로 |
대상을 연결해야 한다.예를 들면 다음과 같습니다.from mongoengine.queryset.visitor import Q
# Get published posts
Post.objects(Q(published=True) | Q(publish_date__lte=datetime.now()))
# Get top posts
Post.objects((Q(featured=True) & Q(hits__gte=1000)) | Q(hits__gte=5000))
Atomic updates(원자 업데이트)
Q
의MongoDB
,QuerySet
,update_one()
,update()
방법으로 자동으로 업데이트할 수 있습니다.다음과 같은 몇 가지 방법을 사용할 수 있습니다.modify()
- 지정된 값으로 설정set
- 지정된 값을 삭제unset
- 값을 지정된 개수inc
- 값을 지정된 개수dec
– push
에 값 추가list
– push_all
에 값 추가list
- 제거pop
의 첫 번째 항목이나 마지막 항목list
의 값에 따라 첫 번째 항목을 삭제할지 마지막 항목을 삭제할지 결정하고, 일반적인 경우pop__=val
는 마이너스로 첫 번째 항목을 삭제하고, 정규로 마지막 항목을 삭제한다. 참고: 몬godb$popval
– val
에서 값 제거pull
– 개list
에서 값 제거pull_all
- 추가할 값이 list
에 없을 때 이 값을 추가합니다원자 업데이트의 구문은 질의 구문과 유사하며 코스메틱 연산자가 필드 앞에 있는 것이지 뒤에 있는 것이 아닙니다.
>>> post = BlogPost(title='Test', page_views=0, tags=['database'])
>>> post.save()
>>> BlogPost.objects(id=post.id).update_one(inc__page_views=1)
>>> post.reload() # the document has been changed, so we need to reload it
>>> post.page_views
1
>>> BlogPost.objects(id=post.id).update_one(set__title='Example Post')
>>> post.reload()
>>> post.title
'Example Post'
>>> BlogPost.objects(id=post.id).update_one(push__tags='nosql')
>>> post.reload()
>>> post.tags
['database', 'nosql']
코스메틱 연산자가 없는 경우 기본값은
add_to_set
입니다.BlogPost.objects(id=post.id).update(title='Example Post')
BlogPost.objects(id=post.id).update(set__title='Example Post')
서버측 JavaScript 실행
Javascript 함수를 작성하여 서버에 전송하여 실행할 수 있습니다.이 반환 결과는 Javascript 함수의 반환 값입니다.이 기능은
list
대상의 $set
방법을 통해 실현되었다.첫 번째 매개변수로 Javascript 함수를 포함하는 문자열을 전달합니다.나머지 위치의 매개변수 이름 필드는 Javascript 함수의 매개변수로 전달됩니다.
JavaScript 함수 범위에서 다음 변수를 사용할 수 있습니다.
QuerySet()
- 해당되는 exec_js()
류의 집합 이름collection
– 1개Document
객체query
- QuerySet
함수에 전달할 매개 변수def sum_field(document, field_name, include_negatives=True):
code = """
function(sumField) {
var total = 0.0;
db[collection].find(query).forEach(function(doc) {
var val = doc[sumField];
if (val >= 0.0 || options.includeNegatives) {
total += val;
}
});
return total;
}
"""
options = {'includeNegatives': include_negatives}
return document.objects.exec_js(code, field_name, **options)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.