Incluye: backend Node.js/Express, visualización 3D (Three.js/3d-force-graph), scrapers Wikipedia/noticias/imágenes, analizador Qwen3-VL, pipeline maestro con systemd timer, fixes de seguridad (NoSQL injection, XSS, ReDoS, port binding) y documentación técnica completa en docs/. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
223 lines
6 KiB
Markdown
223 lines
6 KiB
Markdown
# MongoDB — Contexto técnico FLUJOS
|
||
**Fecha:** 2026-04-21
|
||
**Instancia:** `mongodb://localhost:27017` (solo localhost, no expuesto)
|
||
**Base de datos:** `FLUJOS_DATOS`
|
||
|
||
---
|
||
|
||
## Colecciones y esquema
|
||
|
||
### `wikipedia`
|
||
Artículos scrapeados de la API de Wikipedia por temas.
|
||
|
||
```json
|
||
{
|
||
"_id": ObjectId,
|
||
"archivo": "Nombre_del_articulo.txt", // UNIQUE INDEX — clave de dedup
|
||
"tema": "guerra global",
|
||
"subtema": "alianzas militares",
|
||
"texto": "Contenido completo del artículo...",
|
||
"fecha": ISODate | null
|
||
}
|
||
```
|
||
|
||
### `noticias`
|
||
Artículos scrapeados de ~90 medios internacionales (ver scraper de noticias).
|
||
|
||
```json
|
||
{
|
||
"_id": ObjectId,
|
||
"archivo": "titulo-noticia.txt", // UNIQUE INDEX
|
||
"tema": "guerra global",
|
||
"subtema": "conflictos internacionales",
|
||
"texto": "Texto limpio de la noticia...",
|
||
"fecha": ISODate | null
|
||
}
|
||
```
|
||
|
||
### `torrents`
|
||
Documentos de WikiLeaks y otros torrents de documentos filtrados.
|
||
|
||
```json
|
||
{
|
||
"_id": ObjectId,
|
||
"archivo": "documento.pdf.txt", // UNIQUE INDEX
|
||
"tema": "...",
|
||
"subtema": "...",
|
||
"texto": "...",
|
||
"fecha": ISODate | null
|
||
}
|
||
```
|
||
|
||
### `imagenes`
|
||
Imágenes analizadas por Qwen3-VL-8B. Solo se crea un doc cuando el modelo ha generado descripción.
|
||
|
||
```json
|
||
{
|
||
"_id": ObjectId,
|
||
"archivo": "cambio_climatico_003.jpg", // UNIQUE INDEX
|
||
"image_path": "/var/www/.../IMAGENES/output/wiki_images/cambio_climatico/cambio_climatico_003.jpg",
|
||
"tema": "cambio climático",
|
||
"subtema": "calentamiento global",
|
||
"texto": "descripción generada por Qwen3-VL...",
|
||
"keywords": ["glaciar", "deshielo", "ártico"],
|
||
"fecha": ISODate("2026-04-21")
|
||
}
|
||
```
|
||
|
||
### `imagenes_wiki`
|
||
Imágenes scrapeadas de Wikipedia SIN análisis Qwen. Fallback cuando `imagenes` no tiene el doc.
|
||
|
||
```json
|
||
{
|
||
"_id": ObjectId,
|
||
"archivo": "cambio_climatico_003.jpg", // UNIQUE INDEX
|
||
"image_path": "/var/www/.../output/wiki_images/cambio_climatico/cambio_climatico_003.jpg",
|
||
"image_url": "https://upload.wikimedia.org/...",
|
||
"tema": "cambio climático",
|
||
"subtema": "glaciares árticos",
|
||
"descripcion_wiki": "Descripción Wikimedia del fichero",
|
||
"articulo_titulo": "Calentamiento global",
|
||
"fecha": ISODate("2026-04-21")
|
||
}
|
||
```
|
||
|
||
### `comparaciones`
|
||
Pares de documentos con su similitud calculada. ~52M documentos existentes.
|
||
|
||
```json
|
||
{
|
||
"_id": ObjectId,
|
||
"noticia1": "Nombre_articulo_A.txt",
|
||
"noticia2": "Nombre_articulo_B.txt",
|
||
"porcentaje_similitud": 23.45 // float, % de palabras compartidas
|
||
}
|
||
```
|
||
|
||
**IMPORTANTE:** Esta colección NO tiene índice único porque los 52M docs existentes pueden tener duplicados. Las escrituras usan `update_one(..., upsert=True)` por `(noticia1, noticia2)`.
|
||
|
||
### `pipeline_log`
|
||
Estado de ejecución del pipeline maestro. Un doc por ejecución de fase.
|
||
|
||
```json
|
||
{
|
||
"_id": ObjectId,
|
||
"fase": "scraping" | "analisis" | "comparacion",
|
||
"estado": "en_progreso" | "completado" | "error",
|
||
"inicio": ISODate,
|
||
"fin": ISODate | null,
|
||
"stats": {
|
||
"wikipedia_nuevos": 15,
|
||
"noticias_nuevos": 230,
|
||
"imagenes_wiki_nuevas": 60
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Índices únicos
|
||
|
||
Creados automáticamente por `pipeline_maestro.py::setup_indices()`:
|
||
|
||
```
|
||
wikipedia.archivo UNIQUE ASC
|
||
noticias.archivo UNIQUE ASC
|
||
imagenes.archivo UNIQUE ASC
|
||
imagenes_wiki.archivo UNIQUE ASC
|
||
```
|
||
|
||
El campo `archivo` es el nombre del fichero (ej: `"Guerra_del_Golfo.txt"`). Es la clave de deduplicación en todos los upserts.
|
||
|
||
---
|
||
|
||
## Volumen aproximado (2026-04-21)
|
||
|
||
| Colección | Docs aprox. | Tamaño |
|
||
|---|---|---|
|
||
| wikipedia | ~5.000 | ~50 MB texto |
|
||
| noticias | ~20.000 | ~200 MB texto |
|
||
| torrents | ~500 | ~10 MB |
|
||
| imagenes | ~150 | 1 MB (solo metadatos) |
|
||
| imagenes_wiki | ~500 | 2 MB |
|
||
| comparaciones | ~52.000.000 | ~3.2 GB |
|
||
| pipeline_log | <100 | <1 MB |
|
||
|
||
---
|
||
|
||
## Consultas frecuentes desde la API
|
||
|
||
### Query de nodos (FLUJOS_APP.js línea 67–94)
|
||
```javascript
|
||
// Filtro base
|
||
{ tema: "guerra global", subtema: "...", texto: { $regex: "...", $options: 'i' } }
|
||
|
||
// Con fechas
|
||
{ ..., fecha: { $gte: new Date("2024-01-01"), $lte: new Date("2024-12-31") } }
|
||
```
|
||
|
||
### Query de enlaces (línea 147–155)
|
||
```javascript
|
||
{
|
||
porcentaje_similitud: { $gte: 20.0 },
|
||
noticia1: { $in: [...nodeIds] },
|
||
noticia2: { $in: [...nodeIds] }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Conexión desde Node.js
|
||
|
||
```javascript
|
||
// FLUJOS_APP.js
|
||
const mongoUrl = process.env.MONGO_URL || 'mongodb://localhost:27017';
|
||
const dbName = process.env.DB_NAME || 'FLUJOS_DATOS';
|
||
const client = new MongoClient(mongoUrl);
|
||
await client.connect();
|
||
const db = client.db(dbName);
|
||
```
|
||
|
||
Configuración en `.env`:
|
||
```
|
||
MONGO_URL=mongodb://localhost:27017
|
||
DB_NAME=FLUJOS_DATOS
|
||
```
|
||
|
||
---
|
||
|
||
## Conexión desde Python
|
||
|
||
```python
|
||
from pymongo import MongoClient
|
||
client = MongoClient('mongodb://localhost:27017', serverSelectionTimeoutMS=5000)
|
||
db = client['FLUJOS_DATOS']
|
||
```
|
||
|
||
---
|
||
|
||
## Temas definidos en el sistema
|
||
|
||
Los temas son etiquetas fijas asignadas durante el scraping/tokenización:
|
||
|
||
```
|
||
"guerra global" → subtemas: conflictos internacionales, guerras civiles, terrorismo, armas, alianzas militares
|
||
"inteligencia y seguridad"→ subtemas: inteligencia, ciberseguridad, espionaje, seguridad nacional, contraterrorismo
|
||
"cambio climático" → subtemas: cambio climático, desastres naturales, conservación, energía renovable, escasez de agua
|
||
"demografía y sociedad" → subtemas: sobrepoblación, enfermedades, migraciones, urbanización, despoblación rural
|
||
"economía y corporaciones"→ subtemas: economía global, corporaciones multinacionales, comercio internacional, organismos financieros, desigualdad económica
|
||
"otros" → documentos que no encajan en ningún tema
|
||
```
|
||
|
||
La asignación la hace `pipeline_completo.py::asignar_tema_y_subtema()` buscando palabras clave en el texto.
|
||
|
||
---
|
||
|
||
## Ruta del dato físico
|
||
|
||
```
|
||
MongoDB FLUJOS_DATOS
|
||
└── imagenes_wiki / imagenes
|
||
└── image_path → /var/www/theflows.net/flujos/FLUJOS_DATOS/IMAGENES/output/wiki_images/{tema_slug}/{archivo}
|
||
servido como → https://theflows.net/wiki-images/{tema_slug}/{archivo}
|
||
```
|