- JavaScript 68.5%
- CSS 23.2%
- HTML 8%
- Dockerfile 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| public | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| server.js | ||
🔀 MongoDB Data Mover
Applicazione web per spostare dati tra due database MongoDB differenti con filtri avanzati.
Funzionalità
-
🌳 Struttura Database ad Albero: Visualizza contemporaneamente due database MongoDB con tutte le collection e il conteggio documenti
-
📥 Database Sorgente: Connetti al database di origine per leggere i dati
-
📤 Database Destinazione: Connetti a un database separato per scrivere i dati
-
🔍 Selezione Collection Interattiva: Clicca direttamente sull'albero per selezionare le collection
-
📝 Campi Liberi: Aggiungi filtri personalizzati su qualsiasi campo del documento
-
📅 Filtro Date: Seleziona un intervallo di date basato sul timestamp dell'ObjectId
-
🔄 Spostamento Dati: Sposta i documenti tra database diversi evitando duplicati
-
📊 Statistiche: Visualizza il risultato dell'operazione con dettagli completi
Requisiti
- Node.js (v14 o superiore)
- MongoDB (qualsiasi versione)
- Connessione a due database (sorgente e destinazione)
Installazione
-
Clona o scarica il progetto
-
Installa le dipendenze:
npm install
- Configura le connessioni ai database:
Copia il file .env.example in .env:
cp .env.example .env
Modifica il file .env con le credenziali dei due database:
MONGODB_SOURCE_URI=mongodb://username:password@host:port/source_db
MONGODB_TARGET_URI=mongodb://username:password@host:port/target_db
PORT=3000
⚠️ IMPORTANTE: Le connection string DEVONO includere il nome del database dopo l'host/porta (es: /source_db, /target_db). Se non specifichi il database, l'applicazione non potrà leggere le collection.
Esempi di connection string:
- Locale:
mongodb://localhost:27017/database - Con autenticazione:
mongodb://user:password@localhost:27017/database - Replica set:
mongodb://user:password@host1:27017,host2:27017,host3:27017/database?replicaSet=myReplicaSet - Atlas:
mongodb+srv://user:password@cluster.mongodb.net/database
⚠️ IMPORTANTE: Devi configurare due database diversi (sorgente e destinazione).
- Avvia il server:
npm start
Per lo sviluppo con auto-reload:
npm run dev
- Apri il browser:
Visita
http://localhost:3000
Come Funziona
1. Visualizza la Struttura Database
- La struttura ad albero mostra entrambi i database contemporaneamente
- 📥 SINISTRA: Database SORGENTE (da cui leggere i dati)
- 📤 DESTRA: Database DESTINAZIONE (dove scrivere i dati)
- Ogni collection mostra il numero di documenti contenuti
2. Selezione Collection
- Metodo 1: Clicca direttamente su una collection nell'albero
- Metodo 2: Usa le select dropdown
- Le collection possono avere lo stesso nome ma appartenere a database diversi
4. Campi Liberi (Opzionale)
Aggiungi filtri personalizzati su qualsiasi campo del documento:
- Clicca su "+ Aggiungi Campo" per aggiungere nuovi filtri
- Inserisci il nome del campo e il valore desiderato
- Rimuovi i campi non necessari con il pulsante "✕"
5. Filtro Date
Seleziona l'intervallo di date:
- Data Inizio: Data di inizio (inclusa)
- Data Fine: Data di fine (inclusa)
La data viene estratta automaticamente dal timestamp dell'ObjectId _id.
6. Spostamento Dati
Clicca su "Sposta Dati" per avviare l'operazione. L'applicazione:
- Legge i documenti dal database SORGENTE che soddisfano i filtri
- Filtra per data basata sull'ObjectId
- Scrive i documenti nel database DESTINAZIONE
- Salta i documenti con
_idgià presente nella destinazione - Mostra le statistiche complete
Dettagli Tecnici
Estrazione Data da ObjectId
L'estrazione della data avviene automaticamente dall'ObjectId MongoDB:
const timestamp = new ObjectId(doc._id).getTimestamp();
Prevenzione Duplicati
L'applicazione controlla se un documento con lo stesso _id esiste già nella destinazione:
const existing = await targetCol.findOne({ _id: doc._id });
if (!existing) {
await targetCol.insertOne(doc);
}
Filtri Combinati
Tutti i filtri vengono combinati con AND logico:
{
hierarchy: { company: "DEMO", brand: "DEMO" },
campoPersonalizzato: "valore"
}
Due Connessioni MongoDB
L'applicazione mantiene due connessioni separate:
sourceClient: Connessione al database sorgente (solo lettura)targetClient: Connessione al database destinazione (scrittura)
API Endpoints
GET /api/database-structure
Restituisce la struttura completa di entrambi i database.
Risposta:
{
"success": true,
"source": {
"database": "mongodb://...",
"collections": [
{ "name": "collection1", "count": 1000 },
{ "name": "collection2", "count": 500 }
]
},
"target": {
"database": "mongodb://...",
"collections": [
{ "name": "collection1", "count": 200 },
{ "name": "collection2", "count": 150 }
]
}
}
GET /api/source-collections
Restituisce tutte le collection del database sorgente.
GET /api/target-collections
Restituisce tutte le collection del database destinazione.
POST /api/move-data
Sposta i dati tra collection.
Body:
{
"sourceCollection": "source",
"targetCollection": "target",
"hierarchy": {
"company": "DEMO",
"brand": "DEMO",
"pdv": "110"
},
"freeFields": {
"status": "active"
},
"startDate": "2024-01-01",
"endDate": "2024-01-31"
}
Risposta:
{
"success": true,
"stats": {
"totalFound": 100,
"moved": 95,
"skipped": 5,
"errors": 0
},
"errors": []
}
Struttura del Progetto
moveData/
├── server.js # Server Express con due connessioni MongoDB
├── package.json # Dipendenze e script
├── .env.example # Template configurazione due database
├── .env # Configurazione (da creare)
├── README.md # Documentazione
├── .gitignore # File ignorati da Git
└── public/
├── index.html # Interfaccia con struttura ad albero
├── style.css # Stili responsive
└── app.js # Logica frontend con sincronizzazione
Troubleshooting
Errore di connessione a MongoDB
- Verifica che
MONGODB_SOURCE_URIeMONGODB_TARGET_URInel file.envsiano corretti - Controlla che entrambi i database siano accessibili dalla tua rete
- Verifica le credenziali (username/password) per entrambi i database
- Assicurati di avere i permessi necessari su entrambi i database
Collection non visibili
- Assicurati di avere i permessi per leggere le collection su entrambi i database
- Verifica che le connection string puntino ai database corretti
Nessun documento trovato
- Verifica i filtri impostati
- Controlla che la data sia nell'intervallo corretto
- Usa un client MongoDB (es: Compass) per verificare i dati nel database sorgente
Documenti saltati
- È normale: i documenti con
_idgià presente nella destinazione vengono saltati - Se vuoi sovrascrivere, devi prima cancellare i documenti dalla destinazione
Problemi di sincronizzazione albero/select
- Refresha la pagina per ricaricare la struttura database
- Se selezioni una collection dall'albero, la select si aggiornerà automaticamente
- Se selezioni dalla select, l'albero si aggiornerà automaticamente
Note di Sicurezza
⚠️ IMPORTANTE: Questa applicazione modifica direttamente i database configurati.
- Database Sorgente: Solo in LETTURA (nessun dato viene modificato)
- Database Destinazione: In SCRITTURA (i dati vengono aggiunti)
- Testa sempre prima su database di staging
- Fai un backup del database di destinazione prima di operazioni critiche
- Non esporre il server su internet senza autenticazione aggiuntiva
- Proteggi il file
.enve non includerlo nel controllo versione - I documenti vengono spostati senza modifiche originali
- I documenti duplicati (stesso
_id) vengono saltati, non sovrascritti
Licenza
MIT
Supporto
Per problemi o domande, contatta lo sviluppatore.