@360-l/mongo-bulk-data-migration

中文文档
1.9.0发布于 2026/10/09MITTypeScriptCommonJS近 30 天下载 2731

节点脚本 MongoDB 批量数据迁移

中文使用文档
文档目录18 节
  1. 关于
  2. 为什么是蒙哥堡?
  3. 使用 MBDM 的前提条件
  4. ✅ MBDM 能力
  5. 支持日志
  6. 开始
  7. 安装 MBDM
  8. 运行迁移 update() 财务报告和审定财务报表 rollback()
  9. 简单 $set 示例
  10. QQ 选项
  11. 高级用途
  12. 简单的$set, 有更新调用和投影
  13. 文档的有条件更新
  14. 自动恢复( E) query: FETCH_ALL (中文(简体) )
  15. 删除文档( E) update: DELETE_OPERATION (中文(简体) )
  16. 利用汇总管道( query (中文(简体) )
  17. 删除收藏( E) operation: DELETE_COLLECTION (中文(简体) )
  18. * 简易测试

节点Js的 MongoDB 批量数据迁移

Mongodb计划迁移工具.

关于

MongoBulkDataMigration 是一行的MongoDb迁移工具 用于您一发的迁移. 它速度快,可恢复,自动处理回滚.

为什么是蒙哥堡?

  • 🚀 快点: 建造在 蒙戈散货业务 少强调蒙戈插座。 Bulk在编组操作时适应了大规模更新.

  • 🏔️ 可缩放:处理100万/10亿文件不是问题. 备份在一个专用的集合中完成. Bulks可以被挤出.

  • 🔒 安全而轻松: 备份和还原工作逐批逐步完成. 凡取出并投出的东西,都是作为备份保存的. 在MBDM上所构建的脚本是明确而有重点的.

  • 🔄 可恢复: 如果一个脚本崩溃, 可以恢复它 (断开)。 。 。 . 从设计上来说,在更新或回滚模式中运行两次是安全的.

  • 💝 最小:一个"统一"的扩展脚本由平台处理来写出更少的代码. 还有,测试工具 doRollbackAndAssertForInitialState 将简化 Jest 和 Chai 框架的测试写法.

  • 🏔️ 总体准备情况: 您可以使用简单的查询或聚合管道获取

使用 MBDM 的前提条件

MBDM满足大多数需要,但不是全部需要. 先决条件:

  • MBDM 无法插入新文档 (您只能更新或删除文档)
  • MBDM 只能更新 一次收藏1个
  • MBDM 只能更新文档 一次 同一移民身份证 (除非您手动清理备份)
    • 查询最好不能匹配已经更新的文档 (用于恢复)

✅ MBDM 能力

最大特性使 MBDM 强大 :

  • MBDM 能够 自动回滚 至完全相同的状态预测值:
    • 页:1 $set 业务
    • 页:1 $unset 业务
    • 用于文档删除操作
    • ...对于任何更高级的,你仍然可以使用一个习惯回滚 rollback 函数
  • MBDM 接受基本的蒙哥查询,或 管道合计, (中文(简体) ),
  • MBDM 可以在一个 自动调用,带有定义 maxConcurrentUpdateCalls,允许您调用一个复杂的同步代码.
  • MBDM 让弦乐脚本快速写作 QQ

支持日志

MBDM 数据管理


开始

安装 MBDM

使用 npm

npm install --save-dev @360-l/mongo-bulk-data-migration

运行迁移 update() 财务报告和审定财务报表 rollback()

MBDM 期望连接到您的数据库、 ID( 字符串) 以及目标收藏来处理 .

import { MongoBulkDataMigration } from "@360-l/mongo-bulk-data-migration";

// connect to db
// handle script input

const migration = new MongoBulkDataMigration({
    db: mongoClient,       // MongoClient established instance
    collection: "myCol",   // Collection where there will be an update
    id: "uid_migration",   // Required to rollback storage
    ... // see below for query/update
});

// Do the update
await migration.update();

// Or revert updated properties (only) in all updated documents
await migration.rollback();

MBDM不提供CLI工具. 你可以考虑创建一些结构抽象代码来运行它像. 例如:

node ./myscript.ts --action [update|rollback]

简单 $set 示例

这个迁移将设定 { total: 0 } 每个医生没有0.

注:回滚将自动取消回放总计.

new MongoBulkDataMigration<Score>({
  db,
  id: 'scores_set_total',
  collectionName: 'scores',
  projection: {},
  query: { total: { $exists: false } },
  update: { $set: { total: 0 } },
});

QQ 选项

new MongoBulkDataMigration({ ..., options: { ... } })
  • maxBulkSize (默认: 1000): 要执行的批量更新大小 。 1000是一个很好的数字。 如果您的更新量很大, 请考虑减少, 以避免运行高内存 。 如果文档是微小的,10克可能会在巨大的数据库中稍作改进.
  • dontCount (默认: 虚假): 将跳过初始过滤器 count() 或合计 $count。如果禁用,日志不会打印全部进度 .
  • projectionBackupFilter (默认: 无): 要保存和自动回滚的过滤属性 。 如果您的更新需要虚拟字段, 则有必要 .
  • bypassRollbackValidation 财务报告和审定财务报表 bypassUpdateValidation (默认: 假): 将验证等级设置为"关闭"再设置为"中度".
  • throttle (默认: 0):在批量更新之间睡眠的时间以ms计. 用这来减轻数据库的压力.
  • continueOnBulkWriteError (default: false):会以批量的误差来继续迁移.
  • batchScanSize (默认: 无): 连续扫描收藏 _id 范围 batchScanSize 文档(例如:. 100_000)而不是一个单一的查询. 可用于长期迁移,避免套接字超时.
  • hint (默认: 无): 用于迁移查询及其计数的强制索引

高级用途

MBDM支持Async更新查询,自定义回滚,聚合管道...

简单的$set, 有更新调用和投影

这一迁移将汇总2个预测领域 scoreA 财务报告和审定财务报表 scoreB 用于所有文档(无过滤器).

注意: 回滚会自动回落 scoreA 财务报告和审定财务报表 scoreB 并重设 total。 。 。 .

new MongoBulkDataMigration<Score>({
  db,
  id: 'scores_total_new_field',
  collectionName: 'scores',
  projection: { scoreA: 1, scoreB: 1 },
  query: FETCH_ALL,
  update: (doc) => ({
    $set: {
      total: doc.scoreA + doc.scoreB,
    },
  }),
});

文档的有条件更新

这种迁移将根据外部条件更新文件. 还给我 NO_UPDATE 符号以宣布不需要更新.

import { MongoBulkDataMigration, NO_UPDATE } from "@360-l/mongo-bulk-data-migration";

new MongoBulkDataMigration<Score>({
  db,
  id: 'conditional_update',
  collectionName: 'scores',
  query: FETCH_ALL,
  update: async (doc) => {
    if (! await shouldUpdate(doc)) { return NO_UPDATE; }
    return { $set: { satus: "updated" } };
  },
});

async function shouldUpdate(...) // external check

自动恢复( E)query: FETCH_ALL(中文(简体) )

如果您无法提供仅获取非迁移文档的查询( 如 : newField:{$exists:false},您可以让 MBDM 继续按照上一个 _id 已处理:

import { MongoBulkDataMigration, FETCH_ALL } from "@360-l/mongo-bulk-data-migration";
...
new MongoBulkDataMigration<Score>({
    db,
    id: "update_all_totals",
    collectionName: "scores",
    projection: { total:1 },
    // Automatic resume, iso {}
    query: FETCH_ALL,
    update: () => ({ total: total + 1 }),
});

删除文档( E)update: DELETE_OPERATION(中文(简体) )

此迁移将删除负数的 doc total。 。 。 .

注意:回滚会自动恢复完整的文档.

import { MongoBulkDataMigration, DELETE_OPERATION } from "@360-l/mongo-bulk-data-migration";
...
new MongoBulkDataMigration<Score>({
    db,
    id: "delete_negative_total",
    collectionName: "scores",
    projection: {}, // Everything needs to be projected
    query: { total: { $lt: 0 } },
    update: DELETE_OPERATION,
});

利用汇总管道(query(中文(简体) )

query 期望查询(对象)或聚合管道(阵列). 说明: projection 什么都不会做.

示例:更新 totalGames 对应表格

import { MongoBulkDataMigration } from "@360-l/mongo-bulk-data-migration";
...
new MongoBulkDataMigration<Score>({
    db,
    id: "delete_negative_total",
    collectionName: "scores",
    projection: { "games.value": 1, totalGames: 1 },
    query: [
        { $lookup: { as: "games", ... } },
        { $match: { "games.value": "xxx" } },
    ],
    update: (doc) => ({
        $set: {
            totalGames: doc.games.value
        }
    }),
    options: {
        // Necessary to save only `totalGames`, and not auto-restore uncexisting `games` field
        projectionBackupFilter: ["totalGames"]
    }
});

删除收藏( E)operation: DELETE_COLLECTION(中文(简体) )

收藏会更名为备份收藏. 当你回滚时, 收藏将简单地重新命名为回滚

import { MongoBulkDataMigration, DELETE_COLLECTION } from "@360-l/mongo-bulk-data-migration";
...
const migration status = new MongoBulkDataMigration<Score>({
    db,
    id: "delete_collection_scores",
    collectionName: "scores",
    operation: DELETE_COLLECTION,
});
console.log(status); // { ok: 1 }

* 简易测试

MBDM提供简化测试文件. 只要写你期望的, 用户会确保 数据库恢复到initia状态. 它支持Jest和Chai测试库(expect) (中文(简体) ).

注:对分类文件的预期是按 _id

it('should not modify pages with existing translations', async () => {
  const docs = [{ _id: new ObjectId(), value: 'invalid' }];
  await collection.insertMultiple(docs);

  await dataMigration.update();

  // Test what you expect
  const updatedDocs = await collection.find({}).toArray();
  expect(updatedDocs).toEqual([{ _id: new ObjectId(), value: 'valid' }]);

  // Test rollback will work
  await doRollbackAndAssertForInitialState(dataMigration, docs, { expect });
});

版本与发布记录

@360-l/mongo-bulk-data-migration 共发布 20 个版本,首次发布于 2024/01/06;过去 12 个月发布了 6 个版本。

版本发布日期距今
1.9.0latest2026/10/0929 天前
1.8.22026/07/273 个月前
1.8.12026/07/233 个月前
1.7.02026/06/194 个月前
1.6.02026/03/197 个月前
1.5.22026/02/258 个月前

关于 @360-l/mongo-bulk-data-migration 的常见问题

@360-l/mongo-bulk-data-migration 是什么?

节点脚本 MongoDB 批量数据迁移

如何安装 @360-l/mongo-bulk-data-migration?

在项目目录运行 npm install @360-l/mongo-bulk-data-migration,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:mongodb(*)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@360-l/mongo-bulk-data-migration 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@360-l/mongo-bulk-data-migration 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@360-l/mongo-bulk-data-migration 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 20.19.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@360-l/mongo-bulk-data-migration 可以商用吗?

@360-l/mongo-bulk-data-migration 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@360-l/mongo-bulk-data-migration 的下载量有多少?

根据 npm 官方下载统计,@360-l/mongo-bulk-data-migration 在 2026/10/05 – 2026/11/03 这 30 天内被下载 2,731 次,日均约 91 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@360-l/mongo-bulk-data-migration 还在维护吗?

最新版本 1.9.0 发布于 2026/10/09(29 天前);至今共发布 20 个版本,其中过去 12 个月发布了 6 个;首次发布于 2024/01/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。