API REST construida con FastAPI y MongoDB para la gestión de transporte. El proyecto aplica una arquitectura por capas (rutas, servicios y repositorios) con inyección de dependencias.
Repositorio: JuManoel/NoSQL-backend-proejct
| Tecnología | Uso |
|---|---|
| Python 3.12+ | Lenguaje principal |
| FastAPI | Framework web |
| MongoDB | Base de datos NoSQL |
| PyMongo | Driver de MongoDB |
| uv | Gestión de dependencias y entorno virtual |
| Docker Compose | Orquestación de API y MongoDB |
Elige una de las dos formas de ejecutar el proyecto:
| Forma | Requisitos |
|---|---|
| Docker Compose (recomendado) | Docker y Docker Compose v2 |
| Local con uv | Python 3.12+, uv y MongoDB en ejecución |
git clone git@github.com:JuManoel/NoSQL-backend-proejct.git
cd NoSQL-backend-proejctCopia el archivo de ejemplo y ajusta los valores si es necesario:
cp .env.example .envContenido de .env:
MONGO_URI=mongodb://localhost:27017
DATABASE_NAME=no-sql-projectNota: al usar Docker Compose,
compose.yamlsobrescribeMONGO_URIyDATABASE_NAMEpara que la API se conecte al contenedormongocon autenticación.
Levanta la API y MongoDB juntos con un solo comando:
docker compose up --buildPara ejecutar en segundo plano:
docker compose up --build -dDetener los servicios:
docker compose downServicios definidos en compose.yaml:
| Servicio | Contenedor | Puerto | Descripción |
|---|---|---|---|
api |
fastapi-api |
8000 |
API FastAPI (imagen construida desde Dockerfile) |
mongo |
fastapi-mongo |
27017 |
MongoDB con volumen persistente mongo_data |
Credenciales de MongoDB en Docker:
- Usuario:
root - Contraseña:
rootpassword - Base de datos:
no-sql-project
La API quedará disponible en:
- Base URL:
http://localhost:8000 - Documentación interactiva (Swagger):
http://localhost:8000/docs - Documentación alternativa (ReDoc):
http://localhost:8000/redoc
uv syncCon Docker (solo la base de datos):
docker compose up mongo -dSi usas MongoDB desde Docker, actualiza .env:
MONGO_URI=mongodb://root:rootpassword@localhost:27017/no-sql-project?authSource=admin
DATABASE_NAME=no-sql-projectO con MongoDB instalado localmente:
Asegúrate de que el servicio esté activo y escuchando en el puerto 27017 (sin autenticación, como en .env.example).
uv run uvicorn main:app --reload --host 0.0.0.0 --env-file .env --port 8000La API quedará disponible en:
- Base URL:
http://localhost:8000 - Documentación interactiva (Swagger):
http://localhost:8000/docs - Documentación alternativa (ReDoc):
http://localhost:8000/redoc
.
├── app/
│ ├── config/ # Configuración, dependencias y ciclo de vida
│ ├── shared/ # DTOs, interfaces y utilidades compartidas
│ └── features*/ # Features del projecto, con la seguiente arquitectura: (DTOs, modelos, repos, rutas, servicios)
├── compose.yaml # Orquestación de API y MongoDB con Docker Compose
├── Dockerfile # Imagen de producción de la API
├── main.py # Punto de entrada de la aplicación
├── pyproject.toml # Dependencias y metadatos del proyecto
└── .env.example # Plantilla de variables de entorno
Espacio para enlaces, notas y material consultado durante el desarrollo.
url: https://www.mongodb.com/docs/manual/reference/operator/aggregation/facet/
Permite hacer varios aggregation dentro de la misma query. Cada aggregation tiene su propria logica por debajo. perfecto para cuando necesitas crear una paginacion. un aggregate seria para las pages, y el otro seria la query de consulta como tal.
url: https://www.mongodb.com/docs/manual/reference/operator/aggregation/filter/
$filter recorre un array embebido en el documento y devuelve solo los elementos que cumplen una condición. Es similar a un filter() en Python, pero ejecutado en el servidor.
input: el array a recorrer (por ejemplo,"$messages").as: nombre temporal de cada elemento mientras se itera (aquí"msg"). Dentro decondse referencia con doble$:$$msg.cond: expresión booleana; si es verdadera, el elemento se conserva en el resultado.
En el ejemplo siguiente, $project reconstruye el campo messages dejando solo mensajes cuyo message_id está en unique_ids y que no están eliminados (deleted_at es null):
{
"$project": {
"_id": 0,
"messages": {
"$filter": {
"input": "$messages",
"as": "msg",
"cond": {
"$and": [
{"$in": ["$$msg.message_id", unique_ids]},
{"$eq": ["$$msg.deleted_at", null]}
]
}
}
}
}
}unique_ids es una variable de Python que se inyecta al armar el pipeline (p. ej. [10, 12, 15]).