Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose migrate

Anyone got a migrate module that they use to migrate mongodb data with the mongoose plugin?

I am currently using the 'migrate' module and it works great except for the fact that I need to create/destroy my connection in each up/down.

I.E.

// Setup mongoose
var mongoose = require('mongoose')
  , Role = require('../models/role')
  , User = require('../models/user');

exports.up = function(next) {
  // get a brand new connection for this patch.
  mongoose.connect('mongodb://localhost/sagedb');

  var adminUser = {
    username: 'admin',
    password: 'admin'
  };

  User.createUser(adminUser, function(err, user) {
    if (err)  {
       mongoose.disconnect();  // Make sure to close connection
       return next(err);
    }

    mongoose.disconnect(next); // Make sure to close connection
  });
};

exports.down = function(next) {
  mongoose.connect('mongodb://localhost/sagedb'); // new connection for down

  User.getUserByUsername('admin', function(err, user) {
    if (err) {
      mongoose.disconnect(function() { // make sure to close connection
        return next(err);
      });
    }

    if (!user) {
      mongoose.disconnect(); // make sure to close connection
      return next();
    }

    User.deleteUser(user, function(err, user) {
      console.log('deleted user');
      mongoose.disconnect(next); // make sure to close connection
    });
  });
};

Probably a much better way to do this. Wondering if the only option is to create my own module that starts the connection once and closes it when all patches are complete.

I have seen mongoose-migrate which tracks migration in database collection. Not really specific to mongoose IMHO, I would rather still use the .migrate file but only have to open the connection once.

like image 582
lostintranslation Avatar asked Jul 01 '13 17:07

lostintranslation


1 Answers

The reason of the issue is that you have connection "connected" each time, on every ,migration That is why you have to disconnect. The same situation if you replace connect with mongoose.createConnection. you will need to close it.

How to solve?

move

  var mongoose = require('mongoose')
       , Role = require('../models/role')
       , User = require('../models/user');

into module like db

var mongoose = require('mongoose')
      , Role = require('../models/role')
      , User = require('../models/user');
module.exports = mongoose      

and just require it

      var mongoose = require('./db')

So you will have:

  • Single connection
  • All models loaded in one place
  • Clean code in migrations
like image 142
Serhii Kuts Avatar answered Oct 09 '22 01:10

Serhii Kuts