title: Run database migration (mongodb) with node.js
body: <p>I'm looking for a node module to make mongo database migrations. So far I found <code>mongo-migrate</code>, but not really powerful enough. (Better than nothing but I need more, I'm used to use the Ruby migration which was really powerful!)</p>
  
  <p>I found another one few weeks ago, powerful but doesn't deal with mongoDb, only with MySQL, PostGre and so on.</p>
  
  <p>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.</p>
  
  <p><em>Here an example of what I did so far:</em></p>
  
  <p>*0010-init_category_table.js*</p>
  
  <pre><code>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();
  };
  </code></pre>