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

223 lines
6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 6794)
```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 147155)
```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}
```