{"id":11668,"date":"2026-01-15T11:36:18","date_gmt":"2026-01-15T10:36:18","guid":{"rendered":"https:\/\/spgoo.org\/?page_id=11668"},"modified":"2026-01-15T12:30:32","modified_gmt":"2026-01-15T11:30:32","slug":"fastapi-beanie-mongodb","status":"publish","type":"page","link":"https:\/\/spgoo.org\/?page_id=11668","title":{"rendered":"FastAPI &#8212; beanie &#8212; Mongodb"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">FastAPI &#8212; beanie &#8212; <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span> <\/h2>\n\n\n\n<p>Description du couplage entre le service web et la base de donn\u00e9es : <\/p>\n\n\n\n<p>Lien vers la documentation de <a href=\"https:\/\/beanie-odm.dev\/api-documentation\/operators\/find\/#regex\">beanie<\/a> : <\/p>\n\n\n\n<p>D\u00e9veloppement du module de database avec les interfaces d\u00e9di\u00e9es pour les diff\u00e9rentes op\u00e9rations souhait\u00e9es de manipulation des donn\u00e9es dans le cadre du projet de r\u00e9trosynth\u00e8se. dans ce projet on souhaite stocker dans un syst\u00e8me <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span> deux types de donn\u00e9es, les informations sur la r\u00e9trosynth\u00e8se (le smile, date, la r\u00e9f\u00e9rence interne et nb_routes) et les commentaires sur chaque solution trouv\u00e9e (date, texte du commentaire). Ces diff\u00e9rentes informations seront stock\u00e9es dans une collection d\u00e9di\u00e9e : retrosyntheses et comments. Donc les op\u00e9rations \u00e0 r\u00e9aliser couvrent les aspects  classiques d&#8217;un CRUD.<\/p>\n\n\n\n<p>Exemple de module database : CRUD <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from beanie import init_beanie, PydanticObjectId\n<strong>from beanie.operators import In, RegEx<\/strong>\nfrom motor.motor_asyncio import AsyncIOMotorClient\nfrom pydantic import BaseModel\nfrom pydantic_settings import BaseSettings\nfrom typing import Any, List, Optional\nfrom models.retrosynthese import Retrosynthese\nfrom models.comments import CommentDoc\n\nclass Settings(BaseSettings):\n    DATABASE_URL: Optional&#91;str] = None\n    SECRET_KEY: Optional&#91;str] = None\n    async def initialize_database(self):\n        client = AsyncIOMotorClient(self.DATABASE_URL)\n        await init_beanie(\n        database=client.get_default_database(),document_models=&#91;Retrosynthese, CommentDoc])\n    class Config:\n        env_file = \".env\"\n\nclass Database:\n    def __init__(self, model):\n        self.model = model\n    async def save(self, document) -> None:\n        await document.create()\n        return\n    async def get(self, id: PydanticObjectId) -> Any:\n        doc = await self.model.get(id)\n        if doc:\n            return doc\n        return False\n    async def getOne(self, id:str )->Any:\n        docs = await self.model.find_one(self.model.identifiant == id)\n        return docs\n    async def getOneSmile(self, smile:str )->Any:\n        docs = await self.model.find_one(self.model.smile == smile)\n        return docs\n    async def get_allF(self, filtre: str) -> List&#91;Any]:\n        docs = await self.model.find(<strong>RegEx<\/strong>(self.model.identifiant,filtre)).to_list()\n        return docs\n    async def get_all(self) -> List&#91;Any]:\n        docs = await self.model.find_all().to_list()\n        return docs\n    async def update(self, id: PydanticObjectId, body: BaseModel) -> Any:\n        doc_id = id\n        des_body = body.dict()\n        des_body = {k:v for k,v in des_body.items() if v is not None}\n        update_query = {\"$set\": {\n            field: value for field, value in \n            des_body.items()\n        }}\n        doc = await self.get(doc_id)\n        if not doc:\n            return False\n        await doc.update(update_query)\n        return doc\n    async def delete(self, id: PydanticObjectId) -> bool:\n        doc = await self.get(id)\n        if not doc:\n            return False\n        await doc.delete()\n        return True<\/code><\/pre>\n\n\n\n<p>Explications : il est important pour des manipulations classiques d&#8217;ins\u00e9rer beanie.operator qui nous permettra d&#8217;acc\u00e9der \u00e0 des fonctions sp\u00e9cifiques pour la mise en place de filtre. Dans cette classe, on a mis en place la g\u00e9n\u00e9ricit\u00e9 des mod\u00e8les utilis\u00e9s dans le projet. Ce qui permet d&#8217;avoir les m\u00eames fonctions pour les diff\u00e9rents mod\u00e8les. <\/p>\n\n\n\n<p>Explications de la partie initialize de la database : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async def initialize_database(self):\n        client = AsyncIOMotorClient(self.DATABASE_URL)\n        await init_beanie(\n        database=client.get_default_database(),\n                      document_models=&#91;Retrosynthese, CommentDoc])<\/code><\/pre>\n\n\n\n<p>Dans l&#8217;initialisation de la database, on pr\u00e9cise les mod\u00e8les de donn\u00e9es que l&#8217;on souhaite manipuler. Ce qui dans le code sera d\u00e9finie par l&#8217;instruction suivante : <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>retro_database=Database(Retrosynthese)  # permet d&#8217;ouvrir un descripteur sur la collection retrosynthese<\/li>\n\n\n\n<li>comments_database=Database(CommentDoc) # permet d&#8217;ouvrir un descripteur sur la collection CommenDoc<\/li>\n<\/ul>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Voir les mod\u00e8les <\/summary>\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Retrosynthese(Document):\n    identifiant: str\n    date: datetime\n    smile: str\n    nbroutes: int\n    class Settings:\n       name=\"retrosynthese\"\n    class Config:\n        json_schema_extra = {\n            \"example\": {\n                \"identifiant\": \"74017a01-ffdb-42fe-80ba-ad77f2fe2750\",\n                \"date\":\"01\/01\/2026\",\n                \"smile\": \"O=C(O)N1Cc2ccc(-c3cnc4cnccn34)cc2C1\",\n                \"nbroutes\": 0\n            }\n        }\nclass CommentDoc(Document):\n    identifiant: str\n    date: datetime\n    texte: str\n    class Settings:\n       name=\"comments\"\n    class Config:\n        json_schema_extra = {\n            \"example\": {\n                \"identifiant\": \"74017a01-ffdb-42fe-80ba-ad77f2fe2750_001\",\n                \"date\":datetime.now(),\n                \"texte\": \"commentaires \",\n            }\n        }<\/code><\/pre>\n<\/details>\n\n\n\n<p>Explications des m\u00e9thodes associ\u00e9es \u00e0 cette classe database et l&#8217;utilisation des op\u00e9rateurs : l&#8217;attribut Settings de la classe du mod\u00e8le permet d&#8217;indiquer la collection cibl\u00e9e qui va contenir les donn\u00e9es. <\/p>\n\n\n\n<p>Exemple de mise en place d\u2019agr\u00e9gation <\/p>\n<script type=\"text\/javascript\"> toolTips('.classtoolTips3','<a style=\"text-decoration: none;\" href=\"https:\/\/www.mongodb.com\/fr-fr\"><img style=\"width: 180px; height: 50px;\" src=\"\/wp-content\/uploads\/2025\/01\/mongodb-logo-rgb-scaled.jpg\" \/><\/a>'); <\/script>","protected":false},"excerpt":{"rendered":"<p>FastAPI &#8212; beanie &#8212; MongoDB Description du couplage entre le service web et la base de donn\u00e9es : Lien vers la documentation de beanie : D\u00e9veloppement du module de database avec les interfaces d\u00e9di\u00e9es pour les diff\u00e9rentes op\u00e9rations souhait\u00e9es de manipulation des donn\u00e9es dans le cadre du projet de r\u00e9trosynth\u00e8se. dans ce projet on souhaite [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11668","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11668"}],"version-history":[{"count":19,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11668\/revisions"}],"predecessor-version":[{"id":11695,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11668\/revisions\/11695"}],"wp:attachment":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}