Run database migration (mongodb) with node.js

database-migration, mongodb, node.js

Solution

I just developed this one: https://github.com/eberhara/mongration - you can also find on npm.

We needed a good node migration framework for mongodb, but could not find any - so we built one.

It has lots of better features than the regular migration frameworks:

- Checksum (issues an error when a previosuly ran migration does not match its old version)

- Persists migration state to mongo (there is no regular state file)

- Full support to replica sets

- Automatic handle rollbacks (developers must specify the rollback procedures)

- Ability to run multiple migrations (sync or async) at the same time

- Ability to run migrations against different databases at the same time

Problem

I'm looking for a node module to make mongo database migrations. So far I found `mongo-migrate`, but not really powerful enough. (Better than nothing but I need more, I'm used to use the Ruby migration which was really powerful!) I found another one few weeks ago, powerful but doesn't deal with mongoDb, only with MySQL, PostGre and so on. Do you know a module or something that could help me? I mean, I'm not the first person to want to deal with DB migrations, how do you manage that? My project will be big and I need control. Here an example of what I did so far: *0010-init_category_table.js* ``` var mongodb = require('mongodb'); exports.up = function(db, next){ var documentName = 'category'; var collection = mongodb.Collection(db, documentName); var index; var indexOptions; /** * Create indexes. */ index = { "code": 1 }; indexOptions = { unique: true }; collection.ensureIndex( index, {unique: true, w: 1}, function(error, data){ console.log(error ? error : documentName + ': [ensureIndex] ' + JSON.stringify(index) + JSON.stringify(indexOptions)); }); index = { "name": 1 }; indexOptions = { unique: true }; collection.ensureIndex( index, {unique: true, w: 1}, function(error, data){ console.log(error ? error : documentName + ': [ensureIndex] ' + JSON.stringify(index) + JSON.stringify(indexOptions)); }); /** * Create basic data. */ collection.insert({ code: 'a', name: 'languageStatus' }, {w: 1}, function(error, data){ console.log(error ? error : documentName + ': [insert] ' + JSON.stringify(data)); }); collection.insert({ code: 'b', name: 'accessName' }, {w: 1}, function(error, data){ console.log(error ? error : documentName + ': [insert] ' + JSON.stringify(data)); }); collection.insert({ code: 'c', name: 'roleName' }, {w: 1}, function(error, data){ console.log(error ? error : documentName + ': [insert] ' + JSON.stringify(data)); }); collection.insert({ code: 'd', name: 'translationStatus' }, {w: 1}, function(error, data){ console.log(error ? error : documentName + ': [insert] ' + JSON.stringify(data)); }); /** * Display index information. */ collection.indexInformation(function(error, data){ console.log(error ? error : documentName + ': [indexes] ' + JSON.stringify(data)); }); next(); }; exports.down = function(db, next){ var documentName = 'category'; var document = mongodb.Collection(db, documentName); var query = { $or: [ {name: 'languageStatus'}, {name: 'accessName'}, {name: 'roleName'}, {name: 'translationStatus'} ] }; document.find(query, function(error, data){ data.each(function(error, data){ document.remove(data, {w: 1}, function(error, number){ console.log(error ? error : documentName + ': [remove] (' + number + ') ' + JSON.stringify(data)); }) }); }); next(); }; ```

Original source