Beanie 1.0 발표 - 쿼리 빌더가 포함된 MongoDB ODM🚀🎉
이 문서는 오래되었습니다.
실제 기능과 패턴을 사용하려면 Beanie의 최신 문서를 따르십시오.
문서 링크 - https://roman-right.github.io/beanie/
Beanie 1.0.0 - MongoDB용 Python ODM(객체 문서 매퍼)을 소개하게 되어 기쁩니다!
두 달 전에 나는 최초의 Beanie 릴리스를 발표했습니다. 에 대한 기사를 찾을 수 있습니다. FastAPI와 Beanie로 CRUD 서비스를 만드는 것이 얼마나 간단한지 시연했습니다.
그 이후로 많은 기능이 추가되었습니다. 오늘은 이번 주요 버전 업데이트와 함께 제공되는 가장 흥미로운 점을 보여드리고자 합니다.
이 데모에서는
Product
문서 모델을 사용합니다.from beanie import Document
from pydantic import BaseModel
class Category(BaseModel):
name: str
description: str
class Product(Document):
name: str
description: Optional[str] = None
price: Indexed(float, pymongo.DESCENDING)
category: Category
num: int
class Collection:
name = "products"
indexes = [
[
("name", pymongo.TEXT),
("description", pymongo.TEXT),
],
]
Beanie Document는 Pydantic BaseModel에 대한 추상화입니다. 문서를 유연하고 구조적으로 만드는 데 도움이 됩니다.
이 데모에서는 두 가지 방법으로 여기에 색인을 설정했습니다.
Indexed
필드가 있는 단순Collection
내부 클래스문서 설정에 대한 자세한 정보는 link에서 찾을 수 있습니다.
문서 만들기
Beanie는 단일 문서 생성 패턴 및 일괄 삽입을 제공합니다.
chocolate = Category(name="Chocolate")
# One
caramel_and_nougat = Product(name="Caramel and Nougat ",
num=20,
price=3.05,
category=chocolate)
await caramel_and_nougat.create()
# Many
peanut_bar = Product(name="Peanut Bar",
num=4,
price=4.44,
category=chocolate)
truffle = Product(name="Chocolate Truffle",
num=40,
price=2.50,
category=chocolate)
await Product.insert_many([peanut_bar, truffle])
검색어 찾기
이제 문서 클래스 필드와 함께 Python 기본 비교 연산자를 사용할 수 있습니다.
Product.find(Product.category.name == "Chocolate")
find()
메서드는 비동기 생성기 패턴을 사용하는 FindMany
쿼리를 반환하며 async for
루프를 통해 데이터를 사용할 수 있습니다.async for item in Product.find(
Product.category.name == "Chocolate"
):
print(item)
목록을 검색하려면
to_list()
메서드를 사용합니다.products = await Product.find(
Product.category.name == "Chocolate"
).to_list()
FindMany
쿼리는 정렬, 건너뛰기, 제한 및 프로젝트 메서드도 제공합니다.class ProductShortView(BaseModel):
name: str
price: float
products = await Product.find(
Product.category.name == "Chocolate",
Product.price < 3.5
).sort(-Product.price).limit(10).project(ProductShortView)
Python 비교 연산자는 모든 경우를 다루지는 않습니다. Beanie는 대신 사용할 수 있는 찾기 연산자 목록을 제공합니다.
from beanie.operators import Text
products = await Product.find(Text("Chocolate")).to_list()
찾기 연산자의 전체 목록을 찾을 수 있습니다here
여기에서도 미세 조정을 위해 기본 PyMongo 구문을 사용할 수 있습니다.
products = await Product.find({"price": {"gte": 2}}).to_list()
단일 문서를 찾아야 하는 경우 대신
find_one
메서드를 사용할 수 있습니다.product = await Product.find_one(Product.name == "Peanut Bar")
문서 찾기에 대한 자세한 자습서는 link에서 찾을 수 있습니다.
업데이트
update()
메서드를 사용하면 FindMany
및 FindOne
쿼리의 검색 기준을 사용하여 문서를 업데이트할 수 있습니다.업데이트 연산자를 사용하여 수행할 수 있습니다.
from beanie.operators import Inc, Set
# Many
await Product.find(
Product.name == "Peanut Bar"
).update(Set({Product.price: 5}))
# One
await Product.find_one(
Product.name == "Chocolate Truffle"
).update(Set({Product.price: 3}))
# or
product = await Product.find_one(Product.name == "Peanut Bar")
await product.update(Inc({Product.price: -1}))
업데이트 연산자 목록은 link에서 찾을 수 있습니다.
네이티브 PyMongo 구문도 이에 대해 지원됩니다.
await Product.find(
Product.num <= 5
).update({"$set": {Product.price: 1}})
방법으로 사용할 수 있는 사전 설정 업데이트 작업 목록이 있습니다. 증분, 예:
await Product.find(
Product.category.name == "Chocolate"
).inc({Product.price: 2})
찾기 쿼리 없이 모든 문서를 업데이트하려면
find
단계를 건너뛸 수 있습니다.await Product.inc({Product.price: 2})
집계
업데이트로서 집계는 전체 컬렉션에 대해 또는
FindMany
검색 기준을 사용하여 사용할 수 있습니다.class TotalCountView(BaseModel):
category: str = Field(None, alias="_id")
total: int
# Over collection
total_count = await Product.aggregate(
[{"$group": {"_id": "$category", "total": {"$sum": "$num"}}}],
projection_model=TotalCountView
).to_list()
# Subset
total_count = await Product.find(Product.price < 10).aggregate(
[{"$group": {"_id": "$category", "total": {"$sum": "$num"}}}],
projection_model=TotalCountView
).to_list()
업데이트 작업의 경우 인기 있는 집계에 대한 사전 설정 방법 목록이 있습니다. 예를 들어, 평균:
avg_choco_price = await Product.find(
Product.category.name == "Chocolate"
).avg(Product.price)
Here 모든 사전 설정 방법으로 문서를 찾을 수 있습니다.
삭제
삭제 작업은 동일한 패턴을 지원합니다.
# Many
await Product.find(
Product.category.name == "Chocolate").delete()
# One
product = await Product.find_one(Product.name == "Peanut Bar")
await product.delete()
# Without fetching
await Product.find_one(
Product.name == "Chocolate Truffle"
).delete()
결론
내 첫 번째 기사에서 Beanie는 마이크로 ODM이라고 말했습니다. 지금 접두사
micro
를 제거하고 있습니다. Beanie는 쿼리 빌더, 프로젝션 및 마이그레이션과 같은 많은 기능을 갖춘 MongoDB용 풍부한 Python ODM입니다. 서비스와 애플리케이션을 구축하는 데 많은 도움이 됩니다. 다른 많은 개발자에게도 도움이 되길 바랍니다.거기에 추가할 계획인 흥미로운 것들의 목록이 있습니다. 개발 참여를 언제나 환영합니다 :-) 소중한 시간 내주셔서 감사합니다!
연결
Reference
이 문제에 관하여(Beanie 1.0 발표 - 쿼리 빌더가 포함된 MongoDB ODM🚀🎉), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/romanright/announcing-beanie-1-0-mongodb-odm-with-query-builder-4mbl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)