ระบบ MOPH-IC เป็นระบบฐานข้อมูลการฉีดวัคซีน COVID-19 ที่พัฒนาขึ้นเพื่อจัดเก็บและบริหารจัดการข้อมูลการฉีดวัคซีนของประชาชน โดยใช้ MongoDB เป็นฐานข้อมูลหลัก
moph-ic-handover/
│
├── docker-compose.yml
├── data/ # MongoDB data volume
├── moph-ic-data/ # ข้อมูล JSON สำหรับ import
│ ├── immunization_stat.json
│ └── visit_immunization.json
├── init.sh # Script initialization
└── README.md# Export collection immunization_stat
mongoexport --host <mongodb-host> --port <port> \
--db mophic --collection immunization_stat \
--out moph-ic-data/immunization_stat.json \
--jsonArray
# Export collection visit_immunization
mongoexport --host <mongodb-host> --port <port> \
--db mophic --collection visit_immunization \
--out moph-ic-data/visit_immunization.json \
--jsonArray# ตรวจสอบ format JSON
jq . moph-ic-data/immunization_stat.json | head -20
jq . moph-ic-data/visit_immunization.json | head -20
# นับจำนวน records
jq '. | length' moph-ic-data/immunization_stat.json
jq '. | length' moph-ic-data/visit_immunization.json
## 4. การตั้งค่า Docker Compose
### 4.1 ไฟล์ docker-compose.yml
```yaml
services:
mongodb:
image: mongo:latest
container_name: mongodb
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin
MONGO_INITDB_DATABASE: mophic
ports:
- "17017:27017"
volumes:
- ./data:/data/db
- ./moph-ic-data:/docker-entrypoint-initdb.d/data:ro
- ./init.sh:/docker-entrypoint-initdb.d/init.sh:ro
```
### 4.2 ไฟล์ init.sh
```bash
#!/bin/bash
set -eu
# Loop over each JSON file and import into its own collection
for filepath in /docker-entrypoint-initdb.d/data/*.json; do
collection="$(basename "$filepath" .json)"
echo "[init] importing $collection from $filepath"
mongoimport \
--username "$MONGO_INITDB_ROOT_USERNAME" \
--password "$MONGO_INITDB_ROOT_PASSWORD" \
--authenticationDatabase admin \
--db "$MONGO_INITDB_DATABASE" \
--collection "$collection" \
--file "$filepath" \
--type json
done
```
## 5. การเตรียมไฟล์ init.sh
ไฟล์ init.sh จะถูกรันอัตโนมัติเมื่อ MongoDB container เริ่มทำงาน โดยจะ import ไฟล์ JSON ทั้งหมดที่อยู่ใน folder `/docker-entrypoint-initdb.d/data/`
### 5.1 การตั้ง Permission
```bash
# ตั้ง execute permission ให้กับ init.sh
chmod +x init.sh
```
### 5.2 โครงสร้างการทำงานของ init.sh
```mermaid
flowchart TD
A[MongoDB Container Start] --> B[Run init.sh]
B --> C[Loop ผ่านไฟล์ .json ทั้งหมด]
C --> D[Extract ชื่อ collection จากชื่อไฟล์]
D --> E[Import ข้อมูลเข้า MongoDB]
E --> F{มีไฟล์ .json อื่นอีกไหม?}
F -->|Yes| C
F -->|No| G[MongoDB Ready with Data]
style A fill:#f9f,stroke:#333,stroke-width:2px
style G fill:#9f9,stroke:#333,stroke-width:2px
```
### 5.3 หลักการทำงาน
- Script จะวนลูปหาไฟล์ `.json` ทั้งหมดใน folder `moph-ic-data`
- ใช้ชื่อไฟล์ (ไม่รวม .json) เป็นชื่อ collection
- Import แต่ละไฟล์เข้าสู่ collection ที่สอดคล้องกัน
- ใช้ `--type json` เพื่อระบุว่าเป็นไฟล์ JSON array
## 6. คู่มือการติดตั้งและใช้งาน
### 6.1 ข้อกำหนดเบื้องต้น
- Docker Engine version 20.10 ขึ้นไป
- Docker Compose version 2.0 ขึ้นไป
- พื้นที่ว่างบนฮาร์ดดิสก์อย่างน้อย 50GB
### 6.2 ขั้นตอนการติดตั้ง
```mermaid
flowchart LR
A[1. แตกไฟล์ที่ได้รับ] --> B[2. เข้าไปยัง folder]
B --> C[3. Start Docker Compose]
C --> D[4. รอระบบ Start และ Import อัตโนมัติ]
D --> E[5. ตรวจสอบข้อมูล]
E --> F[6. ระบบพร้อมใช้งาน]
```
#### คำสั่งการติดตั้ง:
```bash
# 1. แตกไฟล์และเข้าไปยัง folder
cd moph-ic-handover
# 2. ตรวจสอบไฟล์ที่จำเป็น
ls -la init.sh moph-ic-data/*.json
# 3. Start Docker Compose
docker-compose up -d
# 4. ตรวจสอบ logs การ import ข้อมูล
docker logs -f mongodb
# 5. ตรวจสอบสถานะ container
docker-compose ps
```
### 6.3 การเข้าใช้งานระบบ
- **MongoDB**: `mongodb://localhost:17017`
- Username: `admin`
- Password: `admin`
- **MongoDB Connection String**:mongodb://admin:admin@localhost:17017/mophic?authSource=admin
## 7. การตรวจสอบข้อมูลหลังการ Import
### 7.1 ผ่าน Mongo Shell
```bash
# เข้าสู่ mongo shell
docker exec -it mongodb mongosh \
-u admin -p admin \
--authenticationDatabase admin
# เลือก database
use mophic
# ตรวจสอบ collections
show collections
# นับจำนวน documents
db.immunization_stat.countDocuments()
db.visit_immunization.countDocuments()
```
### 7.2 ผ่าน MongoDB Client Tools
สามารถใช้ MongoDB client tools ต่างๆ เช่น:
- MongoDB Compass
- Studio 3T
- Robo 3T
โดยใช้ connection string:mongodb://admin:admin@localhost:17017/mophic?authSource=admin
## 8. การ Backup และ Restore
### 8.1 การ Backup ข้อมูลเพิ่มเติม
```bash
# Backup ทั้ง database
docker exec mongodb mongodump \
--username=admin \
--password=admin \
--authenticationDatabase=admin \
--db=mophic \
--out=/data/db/backup-$(date +%Y%m%d)
```
### 8.2 การ Restore จาก Backup
```bash
# Restore จาก dump
docker exec mongodb mongorestore \
--username=admin \
--password=admin \
--authenticationDatabase=admin \
--db=mophic \
/data/db/backup-20250703/mophic
```
## 9. การแก้ไขปัญหาเบื้องต้น
### 9.1 MongoDB ไม่สามารถ start ได้
```bash
# ตรวจสอบ logs
docker-compose logs mongodb
# ลบ container และ volume เก่า
docker-compose down -v
docker-compose up -d
```
### 9.2 Import ข้อมูลไม่สำเร็จ
```bash
# ตรวจสอบไฟล์ JSON
file moph-ic-data/*.json
jq type moph-ic-data/*.json
# ตรวจสอบ permission
ls -la moph-ic-data/
ls -la init.sh
# ตรวจสอบ logs ของ initialization
docker logs mongodb | grep -i "importing"
# Import แบบ manual หากจำเป็น
docker exec -it mongodb mongoimport \
--username=admin \
--password=admin \
--authenticationDatabase=admin \
--db=mophic --collection=immunization_stat \
--file=/docker-entrypoint-initdb.d/data/immunization_stat.json \
--type json
```
## 10. ข้อมูลการติดต่อ
หากพบปัญหาในการติดตั้งหรือใช้งาน กรุณาติดต่อ:
- **ทีมพัฒนา**: MOPH-IC Development Team
- **Email**: support@mophic.moph.go.th
- **โทรศัพท์**: 02-XXX-XXXX
## 11. ภาคผนวก
### 11.1 โครงสร้างข้อมูลใน Collections
#### immunization_stat Collection
ข้อมูลสรุปสถิติการได้รับวัคซีน COVID-19 ของแต่ละบุคคล รวมถึงประวัติการฉีดวัคซีนทุกเข็ม
```json
{
"_id": ObjectId,
"immunization_stat_id": Number,
"cid": String, // เลขบัตรประชาชนที่เข้ารหัส
"vaccine_code": String, // รหัสวัคซีน เช่น "C19"
"immunization_date_1": Date, // วันที่ฉีดเข็มที่ 1
"immunization_date_2": Date, // วันที่ฉีดเข็มที่ 2
"immunization_date_3": Date, // วันที่ฉีดเข็มที่ 3
"immunization_date_4": Date, // วันที่ฉีดเข็มที่ 4
"immunization_date_5": Date, // วันที่ฉีดเข็มที่ 5
"vaccine_ref_name": String, // ชื่อวัคซีนเข็มที่ 1
"vaccine_ref_name_2": String, // ชื่อวัคซีนเข็มที่ 2 (ถ้าต่างกัน)
"vaccine_manufacturer": String, // ผู้ผลิตวัคซีน
"vaccine_manufacturer_2": String, // ผู้ผลิตวัคซีนเข็มที่ 2
"vaccine_manufacturer_id": Number,
"vaccine_manufacturer_id_2": Number,
"percent_complete": Number, // เปอร์เซ็นต์ความสมบูรณ์
"ref_visit_immunization_id": Number,
"certificate_code": String, // รหัสใบรับรอง
"certificate_serial_no": String, // เลขที่ใบรับรอง
"certificate_datetime": Date,
"hospital_code": String, // รหัสโรงพยาบาล
"ref_hospital_name_dose_1": String, // ชื่อโรงพยาบาลที่ฉีดเข็ม 1
"ref_hospital_name_dose_2": String, // ชื่อโรงพยาบาลที่ฉีดเข็ม 2
"ref_hospital_name_dose_3": String, // ชื่อโรงพยาบาลที่ฉีดเข็ม 3
"vaccine_lot_no_dose_1": String, // Lot number เข็ม 1
"vaccine_lot_no_dose_2": String, // Lot number เข็ม 2
"vaccine_lot_no_dose_3": String, // Lot number เข็ม 3
"ref_patient_thai_name": String, // ชื่อผู้รับวัคซีน (ภาษาไทย)
"ref_patient_eng_name": String, // ชื่อผู้รับวัคซีน (ภาษาอังกฤษ)
"ref_patient_address_name": String, // ที่อยู่
"ref_patient_cid": String, // เลขบัตรประชาชน
"ref_patient_passport_no": String, // เลขหนังสือเดินทาง
"ref_patient_gender_name": String, // เพศ
"ref_patient_birth_date": Date, // วันเกิด
"ref_patient_thai_date_of_birth": String, // วันเกิด (ภาษาไทย)
"ref_patient_eng_date_of_birth": String, // วันเกิด (ภาษาอังกฤษ)
"total_dose": Number // จำนวนเข็มที่ได้รับทั้งหมด
}
```
#### visit_immunization Collection
ข้อมูลการเข้ารับวัคซีนแต่ละครั้ง (แต่ละเข็ม) พร้อมรายละเอียดการฉีดวัคซีน
```json
{
"_id": ObjectId,
"visit_immunization_id": Number,
"visit_guid": String, // GUID ของการเข้ารับบริการ
"vaccine_code": String, // รหัสวัคซีน เช่น "C19"
"lot_number": String, // Lot number ของวัคซีน
"expiration_date": Date, // วันหมดอายุของวัคซีน
"immunization_datetime": Date, // วันเวลาที่ฉีดวัคซีน
"immunization_date": Date, // วันที่ฉีดวัคซีน
"visit_immunization_ref_code": String,
"update_datetime": Date, // วันเวลาที่อัพเดทข้อมูล
"cid": String, // เลขบัตรประชาชนที่เข้ารหัส
"hospital_code": String, // รหัสโรงพยาบาล
"ref_hospital_name": String, // ชื่อโรงพยาบาล
"hospital_tmbpart": String, // รหัสตำบล
"hospital_amppart": String, // รหัสอำเภอ
"hospital_chwpart": String, // รหัสจังหวัด
"hospital_region_id": Number, // รหัสเขตสุขภาพ
"field_hospital_code": String, // รหัสโรงพยาบาลสนาม
"field_hospital_name": String,
"practitioner_license_number": String, // เลขใบประกอบวิชาชีพ
"practitioner_name": String, // ชื่อผู้ฉีดวัคซีน
"practitioner_role": String, // ตำแหน่งผู้ฉีดวัคซีน
"vaccine_ref_name": String, // ชื่อวัคซีน
"vaccine_manufacturer": String, // ผู้ผลิตวัคซีน
"vaccine_manufacturer_id": Number,
"vaccine_serial_no": String, // Serial number ของวัคซีน
"vaccine_note": String, // หมายเหตุ
"vaccine_plan_no": Number, // เข็มที่
"vaccine_route_name": String, // วิธีการฉีด
"found_aefi": String, // พบอาการไม่พึงประสงค์หรือไม่ (Y/N)
"aefi_list_text": String, // รายการอาการไม่พึงประสงค์
"need_aefi_followup": String, // ต้องติดตามอาการหรือไม่
"followup_count": Number, // จำนวนครั้งที่ติดตาม
"update_aefi_datetime": Date,
"is_target_person": String, // เป็นกลุ่มเป้าหมายหรือไม่ (Y/N)
"is_target_person_need_vaccine": String, // เป็นกลุ่มที่ต้องได้รับวัคซีนหรือไม่
"ref_patient_name": String, // ชื่อผู้รับวัคซีน
"ref_visit_date": Date, // วันที่เข้ารับบริการ
"ref_birth_date": Date, // วันเกิด
"ref_gender_name": String, // เพศ
"ref_vaccine_name": String, // ชื่อวัคซีน
"ref_hn": String, // HN
"ref_visit_time": String, // เวลาที่เข้ารับบริการ
"ref_phone": String, // เบอร์โทรศัพท์
"ref_province_name": String, // จังหวัด
"person_type_id": Number, // รหัสประเภทบุคคล
"person_type_name": String, // ประเภทบุคคล
"person_risk_type_id": Number, // รหัสกลุ่มเสี่ยง
"person_risk_type_name": String, // ชื่อกลุ่มเสี่ยง
"project_id": Number, // รหัสโครงการ
"project_name": String // ชื่อโครงการ
}
```
### 11.3 ข้อแตกต่างระหว่าง JSON และ JSONL
#### JSON Format (ที่ใช้ในระบบนี้)
```json
[
{"_id": "1", "field": "value1"},
{"_id": "2", "field": "value2"},
{"_id": "3", "field": "value3"}
]
```
- เป็น JSON Array
- ต้องใช้ `--jsonArray` เมื่อ export
- ใช้ `--type json` เมื่อ import
#### JSONL Format{"_id": "1", "field": "value1"} {"_id": "2", "field": "value2"} {"_id": "3", "field": "value3"}
- แต่ละบรรทัดเป็น JSON object
- ไม่ต้องใช้ option พิเศษเมื่อ export/import
---
**เอกสารฉบับนี้จัดทำขึ้นเมื่อ**: วันที่ 3 กรกฎาคม 2568
**เวอร์ชันเอกสาร**: 1.0