使用 node.js 运行数据库迁移 (mongodb)

Posted

技术标签:

【中文标题】使用 node.js 运行数据库迁移 (mongodb)【英文标题】:Run database migration (mongodb) with node.js 【发布时间】:2014-03-05 22:49:48 【问题描述】:

我正在寻找一个节点模块来进行 mongo 数据库迁移。到目前为止,我找到了mongo-migrate,但还不够强大。 (总比没有好,但我需要更多,我习惯使用非常强大的 Ruby 迁移!)

几周前我发现了另一个,功能强大但不处理 mongoDb,只处理 mysql、PostGre 等。

你知道一个模块或可以帮助我的东西吗?我的意思是,我不是第一个想要处理数据库迁移的人,你是如何管理的?我的项目很大,我需要控制。

这是我到目前为止所做的一个例子:

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

【问题讨论】:

很多原因。首先,我们在项目中有几个,使用模式允许我们在不同的脚本上创建索引和数据库配置,所有这些都将在 git 合并后在我们所有的机器上运行。避免在 dev 中的计算机之间进行不同的配置。允许我们很容易地创建测试数据并拥有所有相同的测试数据。也是因为最好看看每个人添加了什么,并允许我们还原诸如错误索引之类的修改。我同意这对于非无模式数据库确实更有用,但它在 mongoDB 上并非没用。 您是如何定义和维护架构的?这不像是可以添加和删除的列。 是的,你是对的,我没有定义任何模式,而是数据和索引(我认为这就是我使用 mongo 迁移所能做的全部)。我现在将在主帖中添加一个示例。 鉴于 MongoDb 的性质,我不希望有比您所拥有的更多的东西。 嗯,是的。只是mongo-migrate 并不完美,我一直在寻找更好的东西。它还不是一个真正有名的模块。 【参考方案1】:

看看https://github.com/emirotin/mongodb-migrations,它似乎功能更加丰富、成熟和维护。

【讨论】:

这个 repo 比现成的所有可用 repo 更好,但听起来这个 repo 不再得到维护,并且随着弃用警告的出现很快就会死去github.com/emirotin/mongodb-migrations/issues/…【参考方案2】:

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

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

它比常规迁移框架有很多更好的功能:

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

【讨论】:

以上是关于使用 node.js 运行数据库迁移 (mongodb)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用不同的 mongo 数据库设置不同的 node.js 环境?

JSONP 支持 node.js 和 mongo

如何使用 mongo、passport 和 node js 更新用户的个人资料?

node.js使用经验记录

夺命雷公狗---node.js---21之项目的构建在node+express+mongo的博客项目6之数据的遍历

Mongoose、Cygwin 和 MongoDB - 不保存