Usar com FastAPI
PyODMongo é totalmente compatível com FastAPI devido à sua base Pydantic. Essa compatibilidade permite utilizar o PyODMongo em aplicações FastAPI de maneira elegante e eficiente, permitindo a criação de consultas dinâmicas em tempo de execução.
from fastapi import FastAPI, Request
from pyodmongo import DbModel, AsyncDbEngine
from pyodmongo.queries import mount_query_filter
from typing import ClassVar
app = FastAPI()
engine = AsyncDbEngine(mongo_uri="mongodb://localhost:27017", db_name="my_db")
class MyModel(DbModel):
attr1: str
attr2: str
attr3: int
_collection: ClassVar = "my_model"
@app.get("/", response_model=list[MyModel])
async def get_route(request: Request):
query, sort = mount_query_filter(
Model=MyModel,
items=request.query_params._dict,
initial_comparison_operators=[],
)
return await engine.find_many(Model=MyModel, query=query, sort=sort)
No exemplo acima, definimos uma rota FastAPI GET / que aceita parâmetros de consulta. A função mount_query_filter, projetada para uso com Request do FastAPI, constrói dinamicamente uma consulta com base nos itens desses parâmetros.
A Função mount_query_filter
A função mount_query_filter se adapta perfeitamente com o FastAPI. Ela constrói dinamicamente uma consulta com base nos itens do dicionário passado, tornando-a compatível com o atributo request.query_params._dict, que contém as query strings da rota.
Parâmetros da função
Model: DbModel: A model para a qual a query será construída.items: dict: O dicionário que contém os items de consulta da query.initial_comparison_operators: list[ComparisonOperator]: Uma lista inicial de operadores de comparação.
A função retorna uma consulta com o operador and aplicado entre todos os itens do dicionário passado.
Exemplo de uso

Quando você aciona a seguinte rota com query strings: http://localhost:8000/?attr1_eq=value_1&attr2_in=%5B'value_2',%20'value_3'%5D&attr3_gte=10&_sort=%5B%5B'attr1',%201%5D,%20%5B'attr2',%20-1%5D%5D, o request.query_params._dict irá conter o seguinte dicionário:
{
"attr1_eq": "value_1",
"attr2_in": "['value_2', 'value_3']",
"attr3_gte": 10,
"_sort": "[['attr1', 1], ['attr2', -1]]",
}
Neste dicionário, as chaves devem ser nomes de atributos seguidos por um sublinhado e um operador válido (por exemplo, "attr1" + "_" + "eq"). Os operadores válidos são: "eq", "gt", "gte", "in", "lt", "lte", "ne", "nin", "sort".
Ao utilizar a função mount_query_filter em combinação com Request do FastAPI, você pode habilitar recursos de consulta poderosos e dinâmicos em suas aplicações.