TypeScript MongoDB Migration Tool
migrate-mongo-ts is a database migration tool specifically designed for MongoDB within Node.js environments, providing robust TypeScript support. As a direct fork of the widely-used `migrate-mongo` package, it adapts its functionality for modern TypeScript workflows, ensuring type safety and improved developer experience when managing database schema changes. The current stable version is 1.2.3. This tool simplifies the process of evolving MongoDB schemas by enabling developers to define discrete 'up' and 'down' migration scripts, which are then applied and rolled back via a command-line interface. Key differentiators include its explicit focus on TypeScript for configuration and migration scripts, offering strong typing for the MongoDB `Db` and `MongoClient` objects passed into migration functions. It supports common operations such as project initialization, creating new migration files, applying pending migrations, rolling back the last migration, and checking migration status, making it a comprehensive solution for maintaining database consistency across various environments. Its release cadence typically mirrors updates from its upstream `migrate-mongo` parent, incorporating TypeScript-specific enhancements.
Common errors
-
Error: MongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
cause MongoDB server is not running or is not accessible at the specified address.fixStart your MongoDB server. Verify the `url` in `migrate-mongo-config.ts` matches your MongoDB instance's address and port. -
migrate-mongo-ts command not found
cause The `migrate-mongo-ts` CLI tool is not installed globally or is not in your system's PATH.fixRun `npm install -g migrate-mongo-ts` to install the CLI globally, or ensure `npm bin` is in your system's PATH. -
TypeError: The 'up' function must return a Promise
cause The `up` (or `down`) function in your migration script is not `async` and does not explicitly return a Promise.fixModify your migration function to be `async`: `export async function up(db: Db) { /* ... */ }`.
Warnings
- gotcha The `migrate-mongo-ts` package is a fork of `migrate-mongo`. While aiming for compatibility, it may diverge in features, bug fixes, or release cadence. Users should be aware of potential differences from the upstream project.
- deprecated When configuring the MongoDB connection, `useNewUrlParser: true` is highly recommended (and often required in newer MongoDB driver versions) to avoid deprecation warnings. Omitting it can lead to warnings or connection issues.
- gotcha Migration functions (`up` and `down`) must return a Promise, either by explicitly returning one or by being declared `async`. Forgetting this can lead to migrations not completing correctly or silently failing.
Install
-
npm install migrate-mongo-ts -
yarn add migrate-mongo-ts -
pnpm add migrate-mongo-ts
Imports
- default export (config)
module.exports = { /* ... */ };// migrate-mongo-config.ts export default { mongodb: { /* ... */ } }; - Db (in migrations)
const { Db } = require('mongodb');import { Db } from 'mongodb'; - up/down functions
function up(db, client, callback) { /* ... */ callback(); }export async function up(db: Db, client: MongoClient) { /* ... */ }
Quickstart
import { Db, MongoClient } from 'mongodb';
// 1. Install CLI: npm install -g migrate-mongo-ts
// 2. Initialize project:
// $ mkdir my-app-migrations
// $ cd my-app-migrations
// $ migrate-mongo-ts init
// This is an example of the generated 'migrate-mongo-config.ts':
export default {
mongodb: {
url: process.env.MONGO_URL ?? "mongodb://localhost:27017",
databaseName: process.env.MONGO_DB_NAME ?? "YOURDATABASENAME",
options: {
useNewUrlParser: true
}
},
migrationsDir: "migrations",
changelogCollectionName: "changelog"
};
// 3. Create a new migration:
// $ migrate-mongo-ts create initial_setup
// This is an example of the generated migration file (e.g., 'migrations/20231027090000-initial_setup.ts'):
export async function up(db: Db, client: MongoClient) {
console.log('Running up migration: initial_setup');
await db.collection('settings').insertOne({ version: '1.0.0', initializedAt: new Date() });
}
export async function down(db: Db, client: MongoClient) {
console.log('Running down migration: initial_setup');
await db.collection('settings').deleteOne({ version: '1.0.0' });
}