猫鼬迁移

时间:2013-07-01 17:13:44

标签: node.js mongodb mongoose migrate

任何人都有一个迁移模块,用于使用mongoose插件迁移mongodb数据?

我目前正在使用'migrate'模块,除了我需要在每个上/下创建/销毁我的连接这一事实之外,它工作得很好。

// 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跟踪数据库集合中的迁移。对于猫鼬IMHO来说并不是特定的,我宁愿仍然使用.migrate文件但只需要打开一次连接。

3 个答案:

答案 0 :(得分:2)

问题的原因是每次迁移都会连接“已连接” 这就是你必须断开连接的原因。 如果用mongoose.createConnection替换connect,则情况相同。你需要关闭它。

如何解决?

移动

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

进入像db

这样的模块
var mongoose = require('mongoose')
      , Role = require('../models/role')
      , User = require('../models/user');
module.exports = mongoose      

只需要它

      var mongoose = require('./db')

所以你会:

  • 单一连接
  • 所有型号都装在一个地方
  • 清理代码 迁移

答案 1 :(得分:0)

您还可以尝试我的migrate-mongoose迁移框架,该框架提供开箱即用的猫鼬连接。

在您的updown功能中,您可以像这样访问您的模型

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

它还会继续迁移到数据库而不是文件系统。

答案 2 :(得分: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();
};