# pmpetit/mongo2pg architecture

> Architecture diagram of the GitHub repository pmpetit/mongo2pg, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/pmpetit/mongo2pg
- Repository: https://github.com/pmpetit/mongo2pg

## Overview

mongo2pg is a Rust CLI/library for assessing and migrating MongoDB data into PostgreSQL. The documented user workflow is init → infer → export → import, with reports for pre- and post-import validation; infer samples MongoDB, builds probabilistic schemas, and generates PostgreSQL DDL. Separate command branches provide Kafka import, connectivity checks, and cluster reports. The graph reflects README claims and indexed source relationships; several command implementations were not excerpted, so some runtime links remain unverified.

Main entry points: [`src/cli/args.rs`](https://github.com/pmpetit/mongo2pg/blob/main/src/cli/args.rs) (CLI dispatch), [`src/commands/infer.rs`](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/infer.rs) (Schema inference), [`src/commands/ping.rs`](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/ping.rs) (Connectivity check), [`src/db/pg.rs`](https://github.com/pmpetit/mongo2pg/blob/main/src/db/pg.rs) (PostgreSQL access)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Migration workflow"]
  node_cli["CLI dispatch<br/>[args.rs]"]
  node_init["Project setup<br/>[init.rs]"]
  node_infer["Schema inference<br/>[infer.rs]"]
  node_config["Config utilities<br/>[util.rs]"]
end

subgraph group_analysis["Schema analysis"]
  node_analyzer["Schema analyzer<br/>[analyzer.rs]"]
  node_ddl["DDL generation<br/>[ddl.rs]"]
  node_stats["Collection stats<br/>[stats.rs]"]
end

subgraph group_transfer["Data transfer"]
  node_export["CSV export<br/>[export.rs]"]
  node_export_engine["Export engine<br/>[export.rs]"]
  node_import["Postgres import<br/>[import.rs]"]
  node_mongo["MongoDB access<br/>[mongo.rs]"]
  node_postgres["PostgreSQL access<br/>[pg.rs]"]
  node_kafka["Kafka import<br/>[kafka_import.rs]"]
  node_kafka_access["Kafka access<br/>[kafka.rs]"]
end

subgraph group_operations["Reporting and operations"]
  node_report["HTML reporting<br/>[report.rs]"]
  node_schema_diagram["ER diagram<br/>[schema_diagram.rs]"]
  node_report_cmd["Report command<br/>[report.rs]"]
  node_ping["Connectivity check<br/>[ping.rs]"]
  node_cluster["Cluster report<br/>[cluster_report.rs]"]
  node_checksum["Data validation<br/>[checksum.rs]"]
end

node_user(("CLI user"))
node_postgres_db[("PostgreSQL")]
node_mongodb_db[("MongoDB")]
node_kafka_service["Kafka"]

node_user -->|"runs commands"| node_cli
node_cli -->|"dispatches"| node_init
node_cli -->|"dispatches"| node_infer
node_cli -->|"dispatches"| node_export
node_cli -->|"dispatches"| node_import
node_cli -->|"dispatches"| node_kafka
node_cli -->|"dispatches"| node_report_cmd
node_cli -->|"dispatches"| node_ping
node_cli -->|"dispatches"| node_cluster
node_init -.->|"creates configuration"| node_config
node_infer -->|"samples collections"| node_mongodb_db
node_infer -->|"processes documents"| node_analyzer
node_infer -->|"generates DDL"| node_ddl
node_infer -->|"computes statistics"| node_stats
node_infer -->|"refreshes reports"| node_report
node_infer -->|"creates diagram"| node_schema_diagram
node_export -->|"streams collections"| node_export_engine
node_export_engine -->|"reads documents"| node_mongodb_db
node_import -->|"loads exported data"| node_postgres
node_postgres -->|"connects to"| node_postgres_db
node_kafka -->|"uses connector"| node_kafka_access
node_kafka_access -.->|"connects to"| node_kafka_service
node_ping -.->|"checks connection"| node_mongodb_db
node_ping -.->|"checks connection"| node_postgres
node_ping -.->|"checks connection"| node_kafka_access
node_report_cmd -->|"renders reports"| node_report
node_report_cmd -->|"renders diagram"| node_schema_diagram
node_cluster -->|"builds overview"| node_report
node_checksum -->|"compares target rows"| node_postgres

click node_cli "https://github.com/pmpetit/mongo2pg/blob/main/src/cli/args.rs"
click node_init "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/init.rs"
click node_infer "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/infer.rs"
click node_analyzer "https://github.com/pmpetit/mongo2pg/blob/main/src/engine/analyzer.rs"
click node_ddl "https://github.com/pmpetit/mongo2pg/blob/main/src/engine/ddl.rs"
click node_stats "https://github.com/pmpetit/mongo2pg/blob/main/src/engine/stats.rs"
click node_export "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/export.rs"
click node_export_engine "https://github.com/pmpetit/mongo2pg/blob/main/src/export.rs"
click node_import "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/import.rs"
click node_mongo "https://github.com/pmpetit/mongo2pg/blob/main/src/db/mongo.rs"
click node_postgres "https://github.com/pmpetit/mongo2pg/blob/main/src/db/pg.rs"
click node_kafka "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/kafka_import.rs"
click node_kafka_access "https://github.com/pmpetit/mongo2pg/blob/main/src/db/kafka.rs"
click node_report "https://github.com/pmpetit/mongo2pg/blob/main/src/report.rs"
click node_schema_diagram "https://github.com/pmpetit/mongo2pg/blob/main/src/schema_diagram.rs"
click node_report_cmd "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/report.rs"
click node_ping "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/ping.rs"
click node_cluster "https://github.com/pmpetit/mongo2pg/blob/main/src/commands/cluster_report.rs"
click node_checksum "https://github.com/pmpetit/mongo2pg/blob/main/src/engine/checksum.rs"
click node_config "https://github.com/pmpetit/mongo2pg/blob/main/src/util.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_init,node_infer,node_config,node_user toneBlue
class node_analyzer,node_ddl,node_stats,node_postgres_db,node_mongodb_db toneAmber
class node_export,node_export_engine,node_import,node_mongo,node_postgres,node_kafka,node_kafka_access toneMint
class node_report,node_schema_diagram,node_report_cmd,node_ping,node_cluster,node_checksum toneRose
class node_kafka_service toneIndigo
```

## Components

### Migration workflow

- [CLI dispatch](https://github.com/pmpetit/mongo2pg/blob/main/src/cli/args.rs): `src/cli/args.rs`
- [Project setup](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/init.rs): `src/commands/init.rs`
- [Schema inference](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/infer.rs): `src/commands/infer.rs`
- [Config utilities](https://github.com/pmpetit/mongo2pg/blob/main/src/util.rs): `src/util.rs`

### Schema analysis

- [Schema analyzer](https://github.com/pmpetit/mongo2pg/blob/main/src/engine/analyzer.rs): `src/engine/analyzer.rs`
- [DDL generation](https://github.com/pmpetit/mongo2pg/blob/main/src/engine/ddl.rs): `src/engine/ddl.rs`
- [Collection stats](https://github.com/pmpetit/mongo2pg/blob/main/src/engine/stats.rs): `src/engine/stats.rs`

### Data transfer

- [CSV export](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/export.rs): `src/commands/export.rs`
- [Export engine](https://github.com/pmpetit/mongo2pg/blob/main/src/export.rs): `src/export.rs`
- [Postgres import](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/import.rs): `src/commands/import.rs`
- [MongoDB access](https://github.com/pmpetit/mongo2pg/blob/main/src/db/mongo.rs): `src/db/mongo.rs`
- [PostgreSQL access](https://github.com/pmpetit/mongo2pg/blob/main/src/db/pg.rs): `src/db/pg.rs`
- [Kafka import](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/kafka_import.rs): `src/commands/kafka_import.rs`
- [Kafka access](https://github.com/pmpetit/mongo2pg/blob/main/src/db/kafka.rs): `src/db/kafka.rs`

### Reporting and operations

- [HTML reporting](https://github.com/pmpetit/mongo2pg/blob/main/src/report.rs): `src/report.rs`
- [ER diagram](https://github.com/pmpetit/mongo2pg/blob/main/src/schema_diagram.rs): `src/schema_diagram.rs`
- [Report command](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/report.rs): `src/commands/report.rs`
- [Connectivity check](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/ping.rs): `src/commands/ping.rs`
- [Cluster report](https://github.com/pmpetit/mongo2pg/blob/main/src/commands/cluster_report.rs): `src/commands/cluster_report.rs`
- [Data validation](https://github.com/pmpetit/mongo2pg/blob/main/src/engine/checksum.rs): `src/engine/checksum.rs`

### Other components

- **CLI user**
- **PostgreSQL**
- **MongoDB**
- **Kafka**

## Connections

- CLI user → CLI dispatch: runs commands (evidence: `README.md`)
- CLI dispatch → Project setup: dispatches
- CLI dispatch → Schema inference: dispatches
- CLI dispatch → CSV export: dispatches
- CLI dispatch → Postgres import: dispatches
- CLI dispatch → Kafka import: dispatches
- CLI dispatch → Report command: dispatches
- CLI dispatch → Connectivity check: dispatches
- CLI dispatch → Cluster report: dispatches
- Project setup → Config utilities: creates configuration
- Schema inference → MongoDB: samples collections (evidence: `README.md`)
- Schema inference → Schema analyzer: processes documents (evidence: `src/commands/infer.rs`)
- Schema inference → DDL generation: generates DDL (evidence: `src/commands/infer.rs`)
- Schema inference → Collection stats: computes statistics (evidence: `src/commands/infer.rs`)
- Schema inference → HTML reporting: refreshes reports (evidence: `src/commands/infer.rs`)
- Schema inference → ER diagram: creates diagram (evidence: `src/commands/infer.rs`)
- CSV export → Export engine: streams collections (evidence: `src/commands/export.rs`)
- Export engine → MongoDB: reads documents (evidence: `src/export.rs`)
- Postgres import → PostgreSQL access: loads exported data (evidence: `README.md`)
- PostgreSQL access → PostgreSQL: connects to (evidence: `src/db/pg.rs`)
- Kafka import → Kafka access: uses connector (evidence: `src/commands/kafka_import.rs`)
- Kafka access → Kafka: connects to
- Connectivity check → MongoDB: checks connection
- Connectivity check → PostgreSQL access: checks connection (evidence: `src/commands/ping.rs`)
- Connectivity check → Kafka access: checks connection (evidence: `src/commands/ping.rs`)
- Report command → HTML reporting: renders reports (evidence: `src/commands/report.rs`)
- Report command → ER diagram: renders diagram (evidence: `src/commands/report.rs`)
- Cluster report → HTML reporting: builds overview (evidence: `src/commands/cluster_report.rs`)
- Data validation → PostgreSQL access: compares target rows (evidence: `src/engine/checksum.rs`)
