Skip to content

Latest commit

 

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NoSQL Backend Project

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ías

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

Requisitos previos

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

Instalación y ejecución

1. Clonar el repositorio

git clone git@github.com:JuManoel/NoSQL-backend-proejct.git
cd NoSQL-backend-proejct

2. Configurar variables de entorno

Copia el archivo de ejemplo y ajusta los valores si es necesario:

cp .env.example .env

Contenido de .env:

MONGO_URI=mongodb://localhost:27017
DATABASE_NAME=no-sql-project

Nota: al usar Docker Compose, compose.yaml sobrescribe MONGO_URI y DATABASE_NAME para que la API se conecte al contenedor mongo con autenticación.


Opción A — Docker Compose (recomendado)

Levanta la API y MongoDB juntos con un solo comando:

docker compose up --build

Para ejecutar en segundo plano:

docker compose up --build -d

Detener los servicios:

docker compose down

Servicios 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

Opción B — Local con uv

Instalar dependencias

uv sync

Levantar MongoDB

Con Docker (solo la base de datos):

docker compose up mongo -d

Si usas MongoDB desde Docker, actualiza .env:

MONGO_URI=mongodb://root:rootpassword@localhost:27017/no-sql-project?authSource=admin
DATABASE_NAME=no-sql-project

O 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).

Ejecutar la aplicación

uv run uvicorn main:app --reload --host 0.0.0.0 --env-file .env --port 8000

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

Estructura del proyecto

.
├── 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

Recursos y documentación de referencia

Espacio para enlaces, notas y material consultado durante el desarrollo.

$facet

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.

$filter (filtrar elementos dentro de un array)

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 de cond se 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]).

About

Projecto de NoSQL con mongo utilizando un backend de python

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages