必须手动创建 migrate-mongo-config.js 文件于项目根目录,配置完整 MongoDB 连接 URL(含 authSource、replicaSet 等参数),指定 databaseName 存放迁移元数据,并确保 Node.js ≥14.18。怎么初始化 migrate-mongo 配置并连接到真实 MongoDB 实例必须先有 migrate-mongo-config.js,否则所有命令都报错 Cannot find config file。这个文件不是自动生成的,得手动写,而且路径必须在项目根目录(或用 -f 显式指定)。常见错误是把 MongoDB 连接字符串写成本地 mongodb://localhost:27017,但实际环境用了副本集或带认证的集群------这时要确保 url 字段包含完整参数,比如 mongodb://user:pass@host:27017/db?authSource=admin&replicaSet=rs0。漏掉 authSource 或 replicaSet 会导致连接成功但迁移失败,错误信息往往是模糊的 Topology is closed 或 NotMaster。配置里 databaseName 是迁移元数据(migrations 集合)存放的数据库,不一定是业务库;建议单独用 migrate-mongo 库,避免污染业务数据mongoclient 选项从 v9 开始已弃用,改用 url + options(如 { useNewUrlParser: true, useUnifiedTopology: true })Node.js 版本需 ≥14.18,低版本会因 fs.promises.rm 报错如何创建和运行一次带副作用的迁移脚本(比如改 schema 或重算字段)迁移脚本本质是两个函数:up 和 down,都接收 db 实例(MongoDB Node Driver 的 Db 对象)。别直接调 db.collection('xxx').updateMany() 就完事------没加 await 会导致迁移标记写入成功但实际操作没跑完。典型场景:给用户集合加默认头像字段。容易踩的坑是没处理空值、没加索引、或者在 up 里用了不支持的语法(比如 setOnInsert 在旧版 MongoDB 不可用)。up 必须返回 Promise,推荐用 async/await 写法,避免回调地狱批量更新务必加 { multi: true }(v3.x 驱动)或用 updateMany()(v4+),否则只改第一条down 不是简单删字段,要考虑数据一致性:如果 up 添加了唯一索引,down 必须先删索引再删字段,否则 dropIndex 会失败测试时用 migrate-mongo up --file xxx.js 单跑一个脚本,比全量 up 更安全module.exports = { async up(db) { await db.collection('users').updateMany( { avatar: null }, { set: { avatar: '/default.png' } } ); await db.collection('users').createIndex({ email: 1 }, { unique: true }); }, async down(db) { await db.collection('users').dropIndex({ email: 1 }); await db.collection('users').updateMany( { avatar: '/default.png' }, { $unset: { avatar: '' } } ); }};为什么 migrate-mongo 的状态记录有时不准,怎么修复迁移卡住的问题它靠 migrations 集合(默认在配置的 databaseName 下)记已执行脚本名和时间戳。一旦网络中断、进程被杀、或脚本抛未捕获异常,就可能出现「脚本实际没跑完,但记录已写入」的情况------下次 up 直接跳过,导致数据不一致。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
极光代码工作室2 小时前
基于数据挖掘的高校图书借阅分析系统rockmelodies2 小时前
用 Python 实现 Docker 镜像批量推送(带进度条)2301_817672262 小时前
如何在 HTML 中正确使用 exif-js 库读取图片 EXIF 元数据Olafur_zbj2 小时前
【python】PDF文件翻译2401_832635582 小时前
如何用 credentials 参数决定 Fetch 是否携带本地的 Cookie试试勇气2 小时前
MySQL--数据库基础粉嘟小飞妹儿2 小时前
mysql如何通过防火墙保护MySQL权限_MySQL网络层安全配置2301_803538952 小时前
如何高效批量删除SQL数据_使用脚本分段删除降低压力书到用时方恨少!2 小时前
Python 面向对象编程:从“过程清单”到“智能积木”的思维革命