使用Node.js运行数据库迁移(MongoDB)。

10

我正在寻找一个可用于进行Mongo数据库迁移的Node模块。目前我找到了mongo-migrate,但它并不是非常强大(虽然比没有要好,但我需要更多功能,我习惯使用Ruby migration,那个真的很强大!)。

我在几周前发现了另一个强大的模块,但它只能处理MySQL、PostGre等数据库,不能使用MongoDb。

您知道有哪些模块或其他方法可以帮助我吗?我的项目将会很大,我需要掌控局面。

这里是我迄今为止所做的示例:

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

2
许多原因。首先,我们有几个人参与项目,使用模式允许我们在不同的脚本中创建索引和数据库配置,这些脚本将在合并git后在所有机器上运行。避免在开发中计算机之间存在不同的配置。允许我们相当容易地创建测试数据并拥有相同的测试数据。但也因为它更好地展示了每个人所添加的内容,并且允许我们撤销修改,例如错误的索引等。我同意这对于非无模式DB确实更有用,但在mongoDB上也不是无用的。 - Vadorequest
1
你是如何定义和维护模式的呢?这不像是可以添加和删除列那样简单。 - WiredPrairie
1
是的,你说得对,我没有定义任何模式,只有数据和索引(我认为这就是使用Mongo迁移所能做的全部)。我现在会在主贴中添加一个示例。 - Vadorequest
1
嗯,是的。这只是因为 mongo-migrate 不完美,我正在寻找更好的替代品。它并不是一个非常出名的模块。 - Vadorequest
1
我建议不要在使用mongoose的情况下使用mongo-migrate,它们无法很好地配合使用。实际上,这个模块并不是很好用,只适用于开发环境和不重要的数据。 - Vadorequest
显示剩余4条评论
2个回答

6

我刚开发了这个项目:https://github.com/eberhara/mongration - 你也可以在npm上找到它。

我们需要一个好的mongodb节点迁移框架,但是找不到任何一个 - 所以我们构建了一个。

它比常规迁移框架具有更多优秀的功能:

  • 校验和(当先前运行的迁移与其旧版本不匹配时会发出错误)
  • 将迁移状态持久化到mongo中(没有常规状态文件)
  • 完全支持副本集
  • 自动处理回滚(开发人员必须指定回滚过程)
  • 能够同时运行多个迁移(同步或异步)
  • 能够同时对不同的数据库运行迁移

0

1
这个仓库在所有可用的仓库中是最好的,但似乎这个仓库不再得到维护,并且很快就会死亡,因为已经开始出现弃用警告。https://github.com/emirotin/mongodb-migrations/issues/45#issuecomment-366611394 - Furqan Aziz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接