# Projekt: Import EDC reportů do MongoDB ## Stav: rozpracováno (2026-05-20) ## Co je hotovo ### Skript `U:/janssen/medidata/edc_import.py` - Import CSV reportů z Medidata Rave EDC do MongoDB - Spuštění: `python edc_import.py downloads/*.csv` - Default MongoDB: `mongodb://192.168.1.76:27017` (bez autentikace) - Default databáze: `edc` - Parametry: `--host`, `--db` ### Dva typy CSV souborů — skript je detekuje automaticky **1. Data Listing reporty** (mají příponu `_DataListing.csv`) - Sloupce: pevná metadata + Field1Value/Field1Label … Field300Value/Field300Label - Kolekce: odvozena z názvu souboru mezi `EDC_` a `_DataListing` - např. `MDD3003_DateofVisit`, `MDD3003_InterimInvestigatorSignature` - Upsert klíč: `form.recordId` - Struktura dokumentu: `study`, `site{}`, `subject{}`, `form{}`, `fields{}`, `lastModified`, `importedAt`, `sourceFile`, `_meta{}` - Importováno a otestováno: `MDD3003_DateofVisit` (381 záznamů) **2. QueryDetails reporty** (mají sloupec `QueryID(ReQry)`) - Kolekce: vždy `queries` (všechny studie dohromady) - Upsert klíč: `queryId` - Struktura dokumentu: `study`, `site{}`, `subject{}`, `visit`, `page`, `field`, `queryGroup`, `queryId`, `queryStatus`, `openedBy/Date`, `answeredBy/Date`, `closedBy/Date`, `daysNotYetClosed`, `daysToAnswer`, `daysToClose`, `queryText`, `answerText`, `importedAt`, `sourceFile`, `_meta{}` - Importováno: 2091 queries (MDD3003, stav 2026-05-20) ### Daily snapshots pro queries - Kolekce: `queries_snapshots` - Každý import QueryDetails zapíše i snapshot s `snapshotDate` (datum ze jména souboru) - Upsert klíč: `(queryId, snapshotDate)` — žádné duplikáty, bezpečný reimport - Účel: sledování vývoje statusů v čase (Open → Answered → Closed → requeried) - Objem: ~3000 queries × 365 dní × 2 roky ≈ 2M dokumentů — MongoDB zvládá ### Logika pro QueryDetails se dvěma soubory Každý den se stahují dva soubory: - Menší: pouze Open + Answered queries - Větší: všechny queries včetně Closed Oba se importují — upsert na `queryId` zajistí, že každá query je v `queries` jednou. Menší soubor je podmnožina většího → výsledek je vždy kompletní sada. ### Indexy **queries:** - `queryId` (unique) - `subject.label`, `site.number`, `queryStatus`, `openedDate` **queries_snapshots:** - `(queryId, snapshotDate)` (unique) - `snapshotDate`, `queryStatus`, `site.number`, `subject.label` **Data Listing kolekce:** - `form.recordId` (unique, sparse) - `subject.id`, `site.id`, `study`, `lastModified` ## Co zbývá udělat - [ ] Importovat zbývající soubory ze složky `downloads` - [ ] Nastavit zálohování MongoDB (obdoba `mysqldump` → `mongodump`) - [ ] Případně naplánovat automatické denní stahování + import ## Příklady dotazů ```js // Aktuální open queries db.queries.find({ queryStatus: "Open" }) // Trend open queries v čase db.queries_snapshots.aggregate([ { $match: { queryStatus: "Open" } }, { $group: { _id: "$snapshotDate", count: { $sum: 1 } } }, { $sort: { _id: 1 } } ]) // Historie statusů jedné query db.queries_snapshots.find( { queryId: "20915933" }, { snapshotDate: 1, queryStatus: 1 } ).sort({ snapshotDate: 1 }) // Queries pacienta db.queries.find({ "subject.label": "CZ100040001" }) // Všechny záznamy ze site db.MDD3003_DateofVisit.find({ "site.number": "S10-CZ10004" }) ``` ## Soubory - Skript: `U:/janssen/medidata/edc_import.py` - Log: `U:/janssen/medidata/edc_import.log` - Stažené CSV: `U:/janssen/medidata/downloads/`