# MongoDB Migration 使用說明 (golang-migrate) 本目錄包含使用 [golang-migrate](https://github.com/golang-migrate/migrate) 執行 MongoDB migration 的配置。 ## 重要說明 **golang-migrate 對 MongoDB 的文件格式要求**: 根據 [golang-migrate 官方文檔](https://github.com/golang-migrate/migrate),MongoDB 驅動支援以下格式: 1. **JSON 格式**:使用 `db.runCommand` 的 JSON 格式 2. **JavaScript 格式**:`.js` 文件,包含 MongoDB shell 命令 **當前狀況**: - 你的 migration 文件是 `.txt` 格式的 MongoDB shell 腳本 - golang-migrate 可能無法直接執行 `.txt` 文件 ## 解決方案 ### 方案 1:將 `.txt` 文件重命名為 `.js`(推薦) golang-migrate 支援 `.js` 文件,你可以將現有的 `.txt` 文件重命名為 `.js`: ```bash # 重命名所有 migration 文件 cd generate/database/mongo for file in *.up.txt; do mv "$file" "${file%.txt}.js"; done for file in *.down.txt; do mv "$file" "${file%.txt}.js"; done ``` ### 方案 2:使用 JSON 格式(如果需要) 如果 `.js` 格式不工作,可以轉換為 JSON 格式。參考 [golang-migrate MongoDB 文檔](https://pkg.go.dev/github.com/golang-migrate/migrate/v4/database/mongodb)。 ## 文件說明 - `Dockerfile-migrate` - 編譯帶 MongoDB 支援的 golang-migrate - `docker-compose-migrate.yml` - Docker Compose 配置 - `scripts/` - 輔助腳本(可選) ## 使用方法 ### 使用 Docker(推薦) #### 執行 UP Migration ```bash # 使用預設配置 make migrate-up # 自定義 MongoDB 連接 make migrate-up MONGO_HOST=localhost:27017 MONGO_DB=digimon_member MONGO_USER=root MONGO_PASSWORD=example ``` #### 執行 DOWN Migration ```bash # 回滾一個版本 make migrate-down # 自定義連接 make migrate-down MONGO_HOST=localhost:27017 MONGO_DB=digimon_member ``` #### 查看版本 ```bash make migrate-version ``` ### 本地執行(需要安裝 migrate) ```bash # 安裝 migrate(帶 MongoDB 支援) go install -tags 'mongodb' github.com/golang-migrate/migrate/v4/cmd/migrate@latest # UP migration make migrate-local-up # DOWN migration make migrate-local-down ``` ## 環境變數 | 變數 | 預設值 | 說明 | |------|--------|------| | `MONGO_HOST` | `127.0.0.1:27017` | MongoDB 主機和端口 | | `MONGO_DB` | `digimon_member` | 資料庫名稱 | | `MONGO_USER` | `root` | 用戶名(可選,留空則不使用認證) | | `MONGO_PASSWORD` | `example` | 密碼(可選) | | `MONGO_AUTH_DB` | `admin` | 認證資料庫 | ## Migration 文件格式 ### 當前格式(.txt) ```javascript db.collection.createIndex({"field": 1}, {unique: true}); ``` ### golang-migrate 支援的格式 #### JavaScript (.js) ```javascript db.collection.createIndex({"field": 1}, {unique: true}); ``` #### JSON 格式 ```json { "createIndexes": "collection", "indexes": [ { "key": {"field": 1}, "name": "field_1", "unique": true } ] } ``` ## 連接字符串參數 golang-migrate 的 MongoDB 連接字符串需要包含: - `x-migrations-collection=migrations` - 指定 migration 版本記錄的集合名稱 完整格式: ``` mongodb://user:password@host:port/database?authSource=admin&x-migrations-collection=migrations ``` ## 注意事項 1. **文件格式**:確保 migration 文件是 `.js` 或 `.json` 格式 2. **版本追蹤**:golang-migrate 會在 MongoDB 中創建 `migrations` 集合來追蹤版本 3. **執行順序**:文件按照文件名中的時間戳順序執行 4. **錯誤處理**:如果 migration 失敗,版本不會更新,可以安全重試 ## 故障排除 ### migrate 命令找不到 ```bash # 安裝 migrate go install -tags 'mongodb' github.com/golang-migrate/migrate/v4/cmd/migrate@latest ``` ### 連接失敗 確保 MongoDB 正在運行,並且連接資訊正確: ```bash # 測試連接 mongosh "mongodb://root:example@127.0.0.1:27017/digimon_member?authSource=admin" ``` ### 文件格式錯誤 如果遇到文件格式錯誤,檢查文件是否為有效的 JavaScript 或 JSON: ```bash # 檢查文件 node -c generate/database/mongo/2024110500000001_account.up.js ``` ## 參考資料 - [golang-migrate GitHub](https://github.com/golang-migrate/migrate) - [MongoDB Driver 文檔](https://pkg.go.dev/github.com/golang-migrate/migrate/v4/database/mongodb) - [CLI 文檔](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate)