DbModel
No PyODMongo, a classe DbModel
serve como elemento fundamental para modelar coleções MongoDB. Quando você cria uma classe que herda de DbModel
, ela automaticamente se torna uma representação de uma coleção no MongoDB.
Graças à integração do PyODMongo e Pydantic, você pode criar coleções MongoDB e definir seu esquema sem esforço, combinando os pontos fortes do MongoDB com a conveniência das classes Pydantic e suas validações de dados.
from pyodmongo import DbModel
from typing import ClassVar
class Product(DbModel):
name: str
price: float
is_available: bool
_collection: ClassVar = "products"
Para garantir que sua classe Python esteja mapeada corretamente para a coleção MongoDB correspondente, é essencial incluir o atributo _collection
. Este atributo deve ser um ClassVar
com um valor de string contendo o nome desejado da coleção em seu banco de dados MongoDB.
Atributos herdados de DbModel
Quando você cria uma classe que herda de DbModel
, ela não apenas representa uma coleção MongoDB, mas também herda alguns atributos adicionais automaticamente. Esses atributos herdados fornecem metadados essenciais para seus documentos e são criados automaticamente se não forem fornecidos explicitamente ao instanciar objetos.
id: Id
Cada documento derivado de DbModel herda um atributo id, representado pela classe Id
. Este atributo serve como um identificador exclusivo para o documento dentro de sua coleção MongoDB. Se você não especificar um id ao criar um novo objeto, ele será gerado automaticamente.
Id Class
Por trás dos panos, o PyODMongo processa instâncias da classe Id
para serem armazenadas como ObjectId
no MongoDB. Essa transformação é tratada de forma transparente, para que você possa interagir com instâncias Id
como se fossem strings regulares em seu código Python. Você também tem a flexibilidade de inserir um str
ou um ObjectId
, o PyODMongo cuidará da conversão.
Tip
O atributo id
é o mesmo _id
no MongoDb.
created_at: datetime
O atributo created_at
no PyODMongo é um carimbo de data/hora totalmente gerenciado pela biblioteca PyODMongo. Serve como um registro de quando um documento foi criado inicialmente no banco de dados. Este atributo é gerado automaticamente no momento da criação do documento.
updated_at: datetime
Da mesma forma, o atributo updated_at
no PyODMongo é outro carimbo de data/hora totalmente gerenciado pela biblioteca PyODMongo. Serve como um indicador de quando um documento foi modificado pela última vez no banco de dados. Este campo é atualizado automaticamente sempre que são feitas alterações no documento.
Relacionamentos
No PyODMongo, você pode modelar relacionamentos entre documentos usando referências e documentos incorporados. Esses relacionamentos permitem representar estruturas e associações de dados complexas em seu banco de dados MongoDB.
Relacionamento por referência
Os relacionamentos por referência envolvem a referência de um documento a outro usando um identificador. No PyODMongo, você pode estabelecer relacionamentos por referência entre documentos incluindo campos que armazenam referências a identificadores de outros documentos.
from pyodmongo import DbModel, Id
from typing import ClassVar
class User(DbModel):
username: str
password: str
_collection: ClassVar = "users"
class Product(DbModel):
name: str
price: float
is_available: bool
user: User | Id
_collection: ClassVar = "products"
Neste caso, o PyODMongo aceitará que user
pode ser uma instância de User
ou uma referência Id
Tip
Você também pode ter uma lista de referências incluindo user: list[User | Id]
Documentos incorporados
Documentos incorporados envolvem aninhar um documento dentro de outro. No PyODMongo, você pode definir relacionamentos incorporados incluindo campos que representam documentos aninhados.
from pyodmongo import DbModel, MainBaseModel
from typing import ClassVar
class Address(MainBaseModel):
street: str
city: str
state: str
zip_code: str
class User(DbModel):
username: str
password: str
address: Address
_collection: ClassVar = "users"
from pyodmongo import DbModel
from pydantic import BaseModel
from typing import ClassVar
class Address(BaseModel):
street: str
city: str
state: str
zip_code: str
class User(DbModel):
username: str
password: str
address: Address
_collection: ClassVar = "users"
Note
A diferença entre usar MainBaseModel
e BaseModel
é que alguns métodos de busca, como o operador $elemMatch
, requerem MainBaseModel
para elementos aninhados. Portanto, é sempre recomendado usar MainBaseModel
.
Tip
Você também pode incorporar documentos de outros objetos DbModel
em vez de BaseModel
. Isso é ótimo quando você deseja manter as informações atuais em um documento.
Aproveitando Relacionamentos
Ao modelar relacionamentos no PyODMongo, você pode criar esquemas de dados mais complexos e estruturados, permitindo construir aplicativos sofisticados que capturam associações de dados do mundo real. Sejam relacionamentos de referência para vincular documentos ou relacionamentos incorporados para aninhar documentos, o PyODMongo oferece flexibilidade para projetar seus modelos de dados de acordo com as necessidades da sua aplicação.