Beanie 1.0 발표 - 쿼리 빌더가 포함된 MongoDB ODM🚀🎉

21441 단어 beaniepythonmongodb
경고!!
이 문서는 오래되었습니다.
실제 기능과 패턴을 사용하려면 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() 메서드를 사용하면 FindManyFindOne 쿼리의 검색 기준을 사용하여 문서를 업데이트할 수 있습니다.

    업데이트 연산자를 사용하여 수행할 수 있습니다.

    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입니다. 서비스와 애플리케이션을 구축하는 데 많은 도움이 됩니다. 다른 많은 개발자에게도 도움이 되길 바랍니다.

    거기에 추가할 계획인 흥미로운 것들의 목록이 있습니다. 개발 참여를 언제나 환영합니다 :-) 소중한 시간 내주셔서 감사합니다!

    연결


  • Beanie Project
  • Documentation
  • Discord Server
  • 좋은 웹페이지 즐겨찾기