# 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} ```