FLUJOS/INFO/DOCS/CONTEXT/MONGODB.md
CAPITANSITO 954f47996f refactor: reorganizar docs y pocs bajo INFO/
- docs/ → INFO/DOCS/CONTEXT/ (documentación técnica en markdown)
- FLUJOS/DOCS/ + FLUJOS_DATOS/DOCS/ → INFO/DOCS/ (txts de arquitectura)
- POCS/ → INFO/POCS/ (pruebas de concepto)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 23:49:33 +02:00

6 KiB
Raw Blame History

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.

{
  "_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).

{
  "_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.

{
  "_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.

{
  "_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.

{
  "_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.

{
  "_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.

{
  "_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 6794)

// 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 147155)

{
  porcentaje_similitud: { $gte: 20.0 },
  noticia1: { $in: [...nodeIds] },
  noticia2: { $in: [...nodeIds] }
}

Conexión desde Node.js

// 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

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}