2013-07-01 3 views
6

У кого-нибудь есть модуль миграции, который они используют для переноса данных mongodb с помощью плагина mongoose?Mongoose migrate

В настоящее время я использую модуль «migrate», и он отлично работает, за исключением того факта, что мне нужно создать/уничтожить мое соединение в каждом направлении вверх/вниз.

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 
    }); 
    }); 
}; 

Возможно, это гораздо лучший способ сделать это. Удивление, если единственным вариантом является создание моего собственного модуля, который запускает соединение один раз и закрывает его, когда все исправления завершены.

Я видел mongoose-migrate, отслеживающий миграцию в базе данных. Не очень специфично для mongoose IMHO, я бы предпочел использовать файл .migrate, но только нужно открыть соединение один раз.

ответ

2

Причина в том, что у вас есть подключение «подключено» каждый раз, на каждом, миграция Вот почему вам нужно отключиться. Такая же ситуация, если вы замените соединение с mongoose.createConnection. вам нужно закрыть его.

Как решить?

движение

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

в модуль как дб

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

и просто требуют

 var mongoose = require('./db') 

Таким образом, вы будете иметь:

  • Одиночные соединения
  • Все модели загружены в одном месте
  • Чистый код в миграции
0

Вы также можете попробовать свои рамки migrate-mongoose миграции, которая обеспечивает соединение мангуста прямо из коробки.

в вашем up или down функции вы можете просто получить доступ к модели, как этот

this('user').findOne({ name: 'Sergey' }); 

Он также сохраняется ваши миграции в файловой системе базы данных вместо.

0

Вы также восточная основа миграции, является очень мощным, и он также имеет MongoDB адаптеры: https://github.com/okv/east

Тогда вы будете клеть миграция с командой:

east create my_migration_name 

И тогда ваши сценарии миграции будут выглядеть это:

exports.migrate = function(client, done) { 
    var db = client.db; 
    db......... 
    done(); 
}; 

exports.rollback = function(client, done) { 
    var db = client.db; 
    db......... 
    done(); 
};