Troud utiliza 5 colecciones principales en MongoDB con validación de esquemas y índices optimizados:
- 👤 users - Información de usuarios registrados
- 👕 articles - Artículos de ropa publicados
- ❤️ reactions - Likes, SuperLikes, DisLikes
- 💕 matches - Coincidencias entre usuarios
- 🖼️ images - Metadatos de imágenes (futuro)
# Asegúrate de tener tu archivo .env configurado
# Ver: MONGODB_SETUP_GUIDE.md# Opción A: Setup completo (recomendado)
npm run db:full-setup
# Opción B: Paso a paso
npm run test:connection # 1. Probar conexión
npm run schema:setup # 2. Crear esquemas
npm run seed # 3. Insertar datos de pruebanpm run test:connectionCampos Requeridos:
userName(string, max 120) - Nombre de usuariophone(string, 7-10 dígitos) - Teléfono únicopassword(string, min 8) - Contraseña hasheadaurlPhoto(string) - URL de foto de perfil
Campos Opcionales:
email(string, validado) - Email con regexprofileId(ObjectId) - Referencia a perfil extendidocreatedAt(Date) - Timestamp de creaciónupdatedAt(Date) - Timestamp de actualización
Índices:
phone(único) - Para login y búsquedasemail- Para búsquedas por emailcreatedAt- Para ordenar por fecha
Campos Requeridos:
phoneOwner(string) - Teléfono del dueñoidOwner(ObjectId) - ID del usuario dueñotype(string) - Tipo de prendasize(string) - Tallaname(string) - Nombre del artículobrand(string) - Marcacondition(enum) - Estado: Nuevo, Usado - Excelente/Buen/Regular estadogender(enum) - Hombre, Mujer, Unisex, Niño, Niñadescription(string) - Descripcióncolor(string) - Color principalurlPhoto(string) - URL de imagencity(string) - Ciudad de ubicación
Índices Optimizados:
- Individuales:
phoneOwner,idOwner,type,gender,city,brand,size - Compuestos:
type + gender + city,phoneOwner + createdAt
Funcionalidad: Sistema tipo Tinder para reaccionar a artículos
Campos Requeridos:
type(enum) - Like, SuperLike, DisLikephoneOwner(string) - Teléfono del dueño del artículophoneUser(string) - Teléfono del usuario que reaccionaidArticle(ObjectId) - ID del artículo
Restricciones:
- Índice único en
phoneUser + idArticle(evita reacciones duplicadas) - Solo una reacción por usuario por artículo
Índices para Matches:
phoneOwner + phoneUser- Detectar reacciones mutuasidArticle + type- Contar likes por artículo
Funcionalidad: Se crea automáticamente cuando dos usuarios se dan like mutuamente
Campos Requeridos:
nameFirst(string) - Nombre del primer usuariophoneFirst(string) - Teléfono del primer usuarionameSecond(string) - Nombre del segundo usuariophoneSecond(string) - Teléfono del segundo usuario
Campos Opcionales:
urlPhotoArticleFirst/Second- URLs de los artículosfirstArticleName/secondArticleName- Nombres de artículosurlChat- URL del chatdate- Fecha del match
Restricción:
- Índice único en
phoneFirst + phoneSecond(evita matches duplicados)
Funcionalidad: Metadatos de imágenes para escalabilidad
Campos:
url(string) - URL de la imagenentityType(enum) - user, articleentityId(ObjectId) - ID de la entidadfilename,size,mimeType- MetadatosuploadedAt- Timestamp de subida
npm run test:connection # Probar conexión a MongoDBnpm run schema:setup # Crear colecciones con validaciones e índices
npm run seed # Insertar datos de prueba
npm run db:full-setup # Setup completo (schema + seed)npm run db:reset # ⚠️ ELIMINAR todas las colecciones1. Validación de Esquema a Nivel de Base de Datos
- MongoDB valida automáticamente los datos
- Previene datos corruptos
- Mejora la integridad
2. Índices Estratégicos
- Únicos:
users.phone,reactions(phoneUser+idArticle),matches(phoneFirst+phoneSecond) - Compuestos: Para queries complejas frecuentes
- Individuales: Para búsquedas y filtros
3. Enum Constraints
condition: Solo valores válidosgender: Categorización estrictareaction.type: Solo Like/SuperLike/DisLike
4. Prevención de Duplicados
- No hay usuarios con mismo teléfono
- No hay reacciones duplicadas
- No hay matches duplicados
npm run db:reset # Eliminar todo
npm run db:full-setup # Recrear desde ceronpm run schema:setup # Recrear solo estructura (no datos)npm run test:connection # Muestra resumen de coleccionesDespués de ejecutar npm run seed, tendrás:
-
Test User Juan (
3001234567)- Email: testuser@example.com
- Password: TestPassword123!
-
Test User Maria (
3009876543)- Email: testmaria@example.com
- Password: TestMaria123!
- Camiseta Nike (Usuario 1)
- Jeans Levi's (Usuario 1)
- Chaqueta Adidas (Usuario 1)
- Vestido Zara (Usuario 2)
- Crear reacciones entre usuarios
- Generar matches automáticos
- Probar toda la funcionalidad
Después del setup, deberías ver algo así:
📊 DATABASE SUMMARY:
==================
📋 USERS:
Documents: 2
Indexes: 4
Custom indexes: phone_1, email_1, createdAt_-1
📋 ARTICLES:
Documents: 4
Indexes: 11
Custom indexes: phoneOwner_1, idOwner_1, type_1, gender_1, city_1, brand_1, size_1, createdAt_-1, type_1_gender_1_city_1, phoneOwner_1_createdAt_-1
📋 REACTIONS:
Documents: 0
Indexes: 8
Custom indexes: idArticle_1, phoneOwner_1, phoneUser_1, type_1, createdAt_-1, phoneOwner_1_phoneUser_1, idArticle_1_type_1, phoneUser_1_idArticle_1
📋 MATCHES:
Documents: 0
Indexes: 4
Custom indexes: phoneFirst_1, phoneSecond_1, createdAt_-1, phoneFirst_1_phoneSecond_1
📋 IMAGES:
Documents: 0
Indexes: 3
Custom indexes: entityType_1_entityId_1, uploadedAt_-1
🎯 PERFORMANCE OPTIMIZATIONS:
✅ Unique constraints on critical fields
✅ Compound indexes for complex queries
✅ Schema validation for data integrity
✅ Proper indexing for search operations
# 1. Verificar .env
cat .env
# 2. Probar conexión básica
npm run test:connection
# 3. Verificar MongoDB Atlas network access# Normal - el script detecta colecciones existentes
# Si necesitas recrear:
npm run db:reset
npm run schema:setup# Los datos no cumplen el esquema
# Verificar que los datos coinciden con las validacionesCon esta configuración tienes:
- ✅ Base de datos completamente estructurada
- ✅ Validaciones automáticas
- ✅ Índices optimizados para rendimiento
- ✅ Datos de prueba listos
- ✅ Scripts de mantenimiento
Tu API está lista para manejar miles de usuarios y artículos eficientemente.