Skip to main content
Glama
init-mongodb.js15.6 kB
// ============================================================================= // Script de inicialización optimizada para MongoDB // Configura índices compuestos, validaciones y optimizaciones de performance // ============================================================================= // Conectar a la base de datos const dbName = 'claude_conversations'; db = db.getSiblingDB(dbName); print("🚀 Iniciando configuración optimizada de MongoDB para Claude Conversation Logger"); // ============================================================================= // CONFIGURACIÓN DE ÍNDICES OPTIMIZADOS // ============================================================================= print("📊 Configurando índices optimizados..."); // Colección: conversations print(" - Configurando índices para colección 'conversations'"); // Índice compuesto principal para búsquedas por proyecto y sesión db.conversations.createIndex( { "project_name": 1, "session_id": 1, "timestamp": -1 }, { name: "project_session_time_idx", background: true, comment: "Índice principal para búsquedas por proyecto y sesión ordenadas por tiempo" } ); // Índice para búsquedas temporales eficientes db.conversations.createIndex( { "timestamp": -1, "project_name": 1 }, { name: "time_project_idx", background: true, comment: "Optimización para consultas recientes por proyecto" } ); // Índice para filtros de estado activo db.conversations.createIndex( { "is_active": 1, "last_activity": -1 }, { name: "active_activity_idx", background: true, comment: "Búsquedas de sesiones activas ordenadas por actividad" } ); // Índice sparse para conversaciones marcadas db.conversations.createIndex( { "is_marked": 1, "marked_at": -1 }, { name: "marked_conversations_idx", sparse: true, background: true, comment: "Índice sparse para conversaciones marcadas" } ); // Índice para búsquedas por tipo de mensaje db.conversations.createIndex( { "messages.role": 1, "timestamp": -1 }, { name: "message_role_time_idx", background: true, comment: "Filtros por tipo de mensaje (user, assistant, system)" } ); // Índice de texto completo para búsqueda full-text db.conversations.createIndex( { "messages.content": "text", "project_name": "text", "session_id": "text", "summary": "text" }, { name: "fulltext_search_idx", weights: { "messages.content": 10, "summary": 5, "project_name": 3, "session_id": 1 }, default_language: "english", language_override: "language", textIndexVersion: 3, background: true, comment: "Índice de texto completo con weights optimizados" } ); // Índice para aggregations de estadísticas db.conversations.createIndex( { "project_name": 1, "timestamp": 1, "message_count": 1 }, { name: "stats_aggregation_idx", background: true, comment: "Optimización para agregaciones de estadísticas" } ); // Colección: conversation_metadata (para datos adicionales) print(" - Configurando índices para colección 'conversation_metadata'"); db.conversation_metadata.createIndex( { "session_id": 1 }, { name: "metadata_session_idx", unique: true, background: true, comment: "Índice único para metadata por sesión" } ); // Índice para tags db.conversation_metadata.createIndex( { "tags": 1, "updated_at": -1 }, { name: "tags_updated_idx", background: true, comment: "Búsquedas por tags ordenadas por actualización" } ); // ============================================================================= // CONFIGURACIÓN DE VALIDACIONES DE ESQUEMA // ============================================================================= print("🔒 Configurando validaciones de esquema..."); // Validación para colección conversations db.runCommand({ collMod: "conversations", validator: { $jsonSchema: { bsonType: "object", required: ["session_id", "project_name", "timestamp", "messages"], properties: { session_id: { bsonType: "string", minLength: 8, maxLength: 100, description: "ID único de sesión (requerido, 8-100 chars)" }, project_name: { bsonType: "string", minLength: 1, maxLength: 200, description: "Nombre del proyecto (requerido, 1-200 chars)" }, timestamp: { bsonType: "date", description: "Timestamp de la conversación (requerido)" }, messages: { bsonType: "array", minItems: 1, items: { bsonType: "object", required: ["role", "content", "timestamp"], properties: { role: { enum: ["user", "assistant", "system", "tool"], description: "Rol del mensaje (user, assistant, system, tool)" }, content: { bsonType: "string", maxLength: 50000, description: "Contenido del mensaje (máx 50k chars)" }, timestamp: { bsonType: "date", description: "Timestamp del mensaje" } } } }, is_active: { bsonType: "bool", description: "Estado activo de la conversación" }, is_marked: { bsonType: "bool", description: "Conversación marcada para seguimiento" }, marked_at: { bsonType: ["date", "null"], description: "Fecha de marcado (opcional)" }, message_count: { bsonType: "int", minimum: 0, description: "Contador de mensajes" }, last_activity: { bsonType: "date", description: "Última actividad registrada" } } } }, validationLevel: "moderate", validationAction: "warn" }); print("✅ Validaciones de esquema configuradas"); // ============================================================================= // CONFIGURACIÓN DE OPTIMIZACIONES DE PERFORMANCE // ============================================================================= print("⚡ Aplicando optimizaciones de performance..."); // Configurar nivel de read concern para mejor performance db.adminCommand({ setDefaultRWConcern: { defaultReadConcern: { level: "local" }, defaultWriteConcern: { w: 1, j: false } } }); // Configurar profiler para queries lentas (solo en desarrollo) if (db.adminCommand("getParameter", { commandName: "setProfilingLevel" }).ok) { db.setProfilingLevel(1, { slowms: 100 }); print("📊 Profiler configurado para queries >100ms"); } // ============================================================================= // CONFIGURACIÓN DE AGREGACIONES PRE-CALCULADAS // ============================================================================= print("🔄 Configurando vistas agregadas..."); // Vista para estadísticas rápidas por proyecto db.createView( "project_stats", "conversations", [ { $group: { _id: "$project_name", total_sessions: { $addToSet: "$session_id" }, total_messages: { $sum: "$message_count" }, last_activity: { $max: "$last_activity" }, first_activity: { $min: "$timestamp" }, active_sessions: { $sum: { $cond: [{ $eq: ["$is_active", true] }, 1, 0] } }, marked_sessions: { $sum: { $cond: [{ $eq: ["$is_marked", true] }, 1, 0] } } } }, { $project: { project_name: "$_id", session_count: { $size: "$total_sessions" }, total_messages: 1, last_activity: 1, first_activity: 1, active_sessions: 1, marked_sessions: 1, _id: 0 } }, { $sort: { last_activity: -1 } } ] ); // Vista para actividad reciente (últimas 24 horas) db.createView( "recent_activity", "conversations", [ { $match: { timestamp: { $gte: new Date(Date.now() - 24 * 60 * 60 * 1000) } } }, { $group: { _id: { project: "$project_name", hour: { $dateToString: { format: "%Y-%m-%d-%H", date: "$timestamp" } } }, message_count: { $sum: "$message_count" }, session_count: { $addToSet: "$session_id" } } }, { $project: { project_name: "$_id.project", hour: "$_id.hour", message_count: 1, session_count: { $size: "$session_count" }, _id: 0 } }, { $sort: { hour: -1 } } ] ); print("📊 Vistas agregadas creadas"); // ============================================================================= // CONFIGURACIÓN DE COMPACTACIÓN Y MANTENIMIENTO // ============================================================================= print("🧹 Configurando mantenimiento automático..."); // Función para compactación automática (solo en desarrollo) function setupMaintenance() { // Esta función se ejecutaría periódicamente via cron o similar print("Configuración de mantenimiento preparada"); // Comandos que se ejecutarían periódicamente: // db.runCommand({ compact: "conversations", force: true }); // db.conversations.reIndex(); } // ============================================================================= // CREACIÓN DE DATOS DE EJEMPLO PARA TESTING // ============================================================================= print("🧪 Configurando datos de ejemplo para testing..."); // Verificar si ya existen datos const existingCount = db.conversations.countDocuments(); if (existingCount === 0) { print("📝 Insertando datos de ejemplo..."); const sampleData = [ { session_id: "test_session_001", project_name: "claude-conversation-logger", timestamp: new Date(), last_activity: new Date(), is_active: true, is_marked: false, message_count: 3, messages: [ { role: "user", content: "Hello, I need help with the conversation logger setup", timestamp: new Date(Date.now() - 300000) }, { role: "assistant", content: "I'd be happy to help you set up the conversation logger. What specific issue are you facing?", timestamp: new Date(Date.now() - 200000) }, { role: "user", content: "I'm having trouble with the MongoDB indexes", timestamp: new Date(Date.now() - 100000) } ] }, { session_id: "test_session_002", project_name: "optimization-project", timestamp: new Date(Date.now() - 86400000), last_activity: new Date(Date.now() - 86400000), is_active: false, is_marked: true, marked_at: new Date(), message_count: 2, messages: [ { role: "user", content: "Can you help optimize my database queries?", timestamp: new Date(Date.now() - 86500000) }, { role: "assistant", content: "Certainly! Let's start by examining your current indexing strategy...", timestamp: new Date(Date.now() - 86400000) } ] } ]; db.conversations.insertMany(sampleData); print(`✅ Insertados ${sampleData.length} documentos de ejemplo`); } else { print(`ℹ️ Base de datos ya contiene ${existingCount} documentos`); } // ============================================================================= // REPORTE FINAL DE CONFIGURACIÓN // ============================================================================= print("\n📋 REPORTE DE CONFIGURACIÓN COMPLETADO"); print("====================================="); // Mostrar índices creados print("\n📊 Índices configurados:"); db.conversations.getIndexes().forEach(function(index) { print(` - ${index.name}: ${JSON.stringify(index.key)}`); }); // Mostrar vistas creadas print("\n👁️ Vistas creadas:"); db.runCommand("listCollections", { filter: { type: "view" } }).cursor.firstBatch.forEach(function(view) { print(` - ${view.name}`); }); // Estadísticas de almacenamiento const stats = db.conversations.stats(); print("\n💾 Estadísticas de almacenamiento:"); print(` - Documentos: ${stats.count}`); print(` - Tamaño promedio por documento: ${Math.round(stats.avgObjSize)} bytes`); print(` - Tamaño total: ${Math.round(stats.size / 1024)} KB`); print(` - Índices: ${stats.nindexes}`); print(` - Tamaño de índices: ${Math.round(stats.totalIndexSize / 1024)} KB`); print("\n✅ Configuración de MongoDB completada exitosamente!"); print("🚀 La base de datos está optimizada para alta performance"); // ============================================================================= // Optimizaciones aplicadas: // // 1. Índices compuestos: Optimización para queries complejas // 2. Índice de texto completo: Búsqueda full-text eficiente // 3. Índices sparse: Optimización de espacio para campos opcionales // 4. Validaciones de esquema: Integridad de datos // 5. Vistas agregadas: Pre-cálculo de estadísticas // 6. Read/Write concerns: Balance entre consistencia y performance // 7. Profiling: Monitoreo de queries lentas // 8. Datos de ejemplo: Testing inmediato // // Performance esperado: 70-90% mejora en queries complejas // =============================================================================

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/LucianoRicardo737/claude-conversation-logger'

If you have feedback or need assistance with the MCP directory API, please join our Discord server