必须手动创建 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助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
花青泽几秒前
5-数据库-SQL注入-联合查询-AND/OR绕过-day13veminhe15 分钟前
元数据索引有关的错一次旅行18 分钟前
AutoAWQ完整实战:MIT激活感知AWQ量化,模型显存减半、推理提速且精度无损踏着七彩祥云的小丑21 分钟前
忘记Redis是否安装过时查看GrowthDiary00738 分钟前
算法题:寻找二维数组top k问题丙氨酸長鏈1 小时前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit APINontee1 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛旋生万物2 小时前
电磁力 = 螺旋联络的 90° 旋转?麦克斯韦方程组的几何重构眞bilibili2 小时前
带团队后的日常思考(十七)久久学姐2 小时前
【AI问答】python引入其他模块的对象