Saltar al contenido

Lección 13 de 25 · Lectura y práctica

Integrar MongoDB para Escenarios NoSQL con Motor Asíncrono

Tipo de lección: VideoConcepto claveIntegrar MongoDB con FastAPI para escenarios NoSQL significa aprovechar la flexibilidad de esquemas y la escalabilidad horizontal que ofrecen las bases de datos documentales. En el mundo real,.

Del concepto a la práctica

Taller de esta lección

MongoDB puede encajar cuando una ficha editorial contiene metadatos variables; compara también la alternativa SQL con JSON y tus necesidades transaccionales. Actualización de herramienta: la documentación oficial fija la deprecación de Motor en el 14 de mayo de 2026 y recomienda PyMongo Async para código nuevo. El nombre de la lección conserva su referencia histórica; esta ampliación practica la API actual. La flexibilidad no elimina la necesidad de una forma mínima: exige validar identificador, título y versión del documento. Además, el identificador devuelto debe convertirse a una representación serializable.

Ejemplo resuelto

Se guarda una ficha con article_id:44, language:"es" y blocks con dos objetos. Una segunda ficha para el mismo artículo usa language:"en" y añade reading_time:3 sin alterar la primera. Suponemos unicidad de (article_id, language), no de article_id solo. La respuesta expone id como texto, no como objeto interno.

En el repositorio, con una colección local de laboratorio previamente preparada, una proyección serializable puede conservar únicamente datos simples:

python
async def list_cards(collection):
    cursor = collection.find({"article_id": 44}).sort("language", 1)
    return [
        {"id": str(doc["_id"]), "language": doc["language"]}
        async for doc in cursor
    ]

El cliente actual se importa como from pymongo import AsyncMongoClient. find produce un cursor sin await; iterarlo es asíncrono. Restringe este ejemplo a una base local de prueba y cierra el cliente en el ciclo de vida.

Pruébalo

  1. Define el documento mínimo y su validador.

  2. Inserta las dos fichas con el mismo artículo.

  3. Consulta por article_id y ordena por idioma.

  4. Serializa el identificador antes de responder.

Comprueba tu resultado

La consulta devuelve dos documentos y ambos tienen id textual; el documento inicial conserva exactamente sus campos.

Error frecuente: devolver directamente un identificador no serializable. Corrígelo mediante un esquema de respuesta y prueba json.dumps sobre el resultado.

Tablas de clientes y pedidos: INNER JOIN conserva coincidencias y LEFT JOIN conserva también a Luis sin pedidos.
CursaloMapa de práctica
Relacionar tablas sin perder filas

Una clave conecta cada pedido con su cliente. INNER JOIN devuelve las coincidencias y puede producir varias filas por cliente. LEFT JOIN conserva también los clientes sin pedido y representa los campos ausentes con NULL.

Ver la infografía en tamaño completo ↗

Tipo de lección: Video

Concepto clave

Integrar MongoDB con FastAPI para escenarios NoSQL significa aprovechar la flexibilidad de esquemas y la escalabilidad horizontal que ofrecen las bases de datos documentales. En el mundo real, imagina una red social donde cada usuario tiene un perfil único con campos variables: algunos tienen educación detallada, otros hobbies extensos, y otros prefieren mantenerlo minimalista. MongoDB permite almacenar estos documentos sin forzar un esquema rigido, similar a como organizarias archivos en carpetas flexibles en lugar de tablas fijas.

El motor asíncrono de MongoDB (Motor) es crucial para aplicaciones de alto rendimiento. A diferencia de las operaciones sincrónicas que bloquean el hilo de ejecución esperando respuestas de la base de datos, el enfoque asíncrono permite que FastAPI maneje múltiples solicitudes simultáneamente, mejorando la eficiencia en escenarios como APIs con miles de usuarios concurrentes. Es como tener un equipo de mensajeros que entregan paquetes sin detener la oficina principal, en lugar de un solo mensajero que hace todo secuencialmente.

Cómo funciona en la práctica

Para integrar MongoDB con FastAPI, seguimos un flujo estructurado que garantiza robustez y mantenibilidad. Primero, configuramos la conexión asíncrona usando Motor, definiendo una URL de conexión que incluya credenciales y opciones como timeouts. Luego, creamos modelos Pydantic para validar y serializar datos, aprovechando que MongoDB usa documentos BSON pero trabajamos con objetos Python. Finalmente, implementamos operaciones CRUD asíncronas en rutas FastAPI, manejando excepciones específicas de MongoDB como DuplicateKeyError.

Un ejemplo paso a paso: 1) Instalar dependencias (fastapi, uvicorn, motor, pymongo). 2) Configurar variables de entorno para la URI de MongoDB. 3) Crear un cliente asíncrono en un módulo de base de datos. 4) Definir esquemas Pydantic con tipos opcionales para campos flexibles. 5) Implementar endpoints con decoradores FastAPI y funciones async. 6) Probar con herramientas como Postman o curl, verificando respuestas JSON y códigos de estado.

Codigo en accion

Configuración inicial de la conexión:

# database.py
from motor.motor_asyncio import AsyncIOMotorClient
import os

MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017")
client = AsyncIOMotorClient(MONGO_URI)
database = client["fastapi_db"]
users_collection = database["users"]

Antes: Usar conexión sincrónica que bloquea el evento loop. Despues: Conexión asíncrona que mejora el rendimiento.

Endpoint para crear un usuario:

# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from typing import Optional
from database import users_collection
from bson import ObjectId

app = FastAPI()

class UserCreate(BaseModel):
    name: str
    email: str
    age: Optional[int] = None
    metadata: Optional[dict] = {}

class UserResponse(UserCreate):
    id: str

    class Config:
        json_encoders = {ObjectId: str}

@app.post("/users/", response_model=UserResponse)
async def create_user(user: UserCreate):
    try:
        result = await users_collection.insert_one(user.dict())
        user_data = user.dict()
        user_data["id"] = str(result.inserted_id)
        return UserResponse(**user_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error creating user: {str(e)}")

Errores comunes

  • No manejar ObjectId en respuestas JSON: MongoDB devuelve _id como ObjectId, que no es serializable directamente a JSON. Solución: Convertir a string usando str() o definir json_encoders en Pydantic.
  • Usar operaciones bloqueantes en funciones async: Llamar a métodos sincrónicos de pymongo dentro de endpoints async puede degradar el rendimiento. Solución: Usar exclusivamente motor.motor_asyncio para todas las operaciones.
  • Falta de validación de esquemas flexibles: En NoSQL, es tentador aceptar cualquier dato, pero esto lleva a inconsistencias. Solución: Usar Pydantic con campos Optional y validaciones personalizadas para mantener calidad.
  • No configurar timeouts de conexión: En producción, conexiones infinitas pueden causar bloqueos. Solución: Añadir parámetros como connectTimeoutMS en la URI de MongoDB.
  • Ignorar índices para consultas frecuentes: Sin índices, consultas en grandes colecciones son lentas. Solución: Crear índices en campos como email o name usando create_index de manera asíncrona.

Checklist de dominio

  1. Configurar conexión asíncrona a MongoDB usando variables de entorno.
  2. Definir modelos Pydantic que mapeen documentos BSON a objetos Python.
  3. Implementar operaciones CRUD completas (crear, leer, actualizar, eliminar) con manejo de errores.
  4. Usar agregaciones de MongoDB para consultas complejas, como búsquedas con $match y $group.
  5. Probar la API con datos reales, verificando respuestas y tiempos de ejecución.
  6. Optimizar consultas con índices y proyecciones para reducir transferencia de datos.
  7. Documentar endpoints con ejemplos de solicitud y respuesta en la documentación automática de FastAPI.

Implementar un sistema de blog con FastAPI y MongoDB

En este ejercicio, construirás una API para un blog que permita crear posts, agregar comentarios, y buscar contenido por etiquetas, utilizando MongoDB como base de datos NoSQL.

  1. Configura el entorno: Crea un proyecto FastAPI, instala motor y pymongo, y configura una conexión asíncrona a una base de datos MongoDB local o en la nube (puedes usar MongoDB Atlas para pruebas).
  2. Define los modelos: Crea esquemas Pydantic para Post (con campos como title, content, tags, author) y Comment (con text, author, timestamp). Usa tipos Optional para campos como tags que pueden ser flexibles.
  3. Implementa endpoints:
    • POST /posts/ para crear un nuevo post.
    • GET /posts/ para listar todos los posts con paginación (usando skip y limit).
    • GET /posts/{post_id} para obtener un post específico con sus comentarios anidados.
    • POST /posts/{post_id}/comments para agregar un comentario a un post.
    • GET /posts/search/?tag= para buscar posts por etiquetas usando operadores de MongoDB como $in.
  4. Añade características avanzadas: Implementa una agregación para contar comentarios por post y devolverlo en la respuesta, y crea un índice en el campo tags para optimizar búsquedas.
  5. Prueba la API: Usa herramientas como Postman o curl para verificar que todos los endpoints funcionen correctamente, manejando errores como posts no encontrados con HTTP 404.
Pistas
  • Usa la estructura de documentos anidados en MongoDB para almacenar comentarios dentro de cada post, pero considera la escalabilidad si los comentarios crecen mucho.
  • Para la paginación, recuerda que MongoDB usa skip y limit; en producción, considera usar rangos basados en _id para mejor rendimiento.
  • En las búsquedas por etiquetas, usa $in en lugar de igualdad exacta para permitir múltiples etiquetas en un solo post.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con Dominio Profesional de FastAPI: Construcción de APIs Escalables y Seguras

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.