Files
janssen/claude-memory/project_edc_mongo.md
administrator 2d65ad2988 Add Claude memory store synced via Gitea
Move ~/.claude/projects/U--janssen/memory into repo (claude-memory/)
linked back via a directory junction so memory persists across machines.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 22:57:44 +02:00

93 lines
3.5 KiB
Markdown
Raw Permalink 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.
# 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/`