将数据库从MySQL转换为MongoDB

63

有没有一种简单的方法可以将数据库从MySQL更改为MongoDB?

或者更好的是,有人建议我一个做这件事的好教程吗?


你是在寻找一种数据传输的流程,还是方法论上的改变? - Nix
完成该任务的过程是:我已经有大约五十万条记录。 - user737767
1
你需要考虑最佳的方式将MySQL中的数据存储到MongoDB中。然后自己编写任何语言的映射。 - Eugeny89
可能是MySQL导出到MongoDB的重复问题。 - om-nom-nom
13个回答

58

有没有简单的方法可以从mysql更改数据库到mongoDB?

方法一: 以CSV格式从MySQL导出,然后使用mongoimport工具。但是,在处理日期和二进制数据方面,这种方法并不总是有效。

方法二: 使用您选择的编程语言来编写转移脚本。基本上,您需要编写一个程序,逐个元素从MySQL中读取所有内容,然后将其插入MongoDB。

方法二比方法一更好,但仍然不足够。

MongoDB使用集合而不是表。 MongoDB不支持连接。在我看过的每个数据库中,这意味着您在MongoDB中的数据结构与MySQL中的结构不同。

因此,没有“通用工具”可用于将SQL迁移到MongoDB。在到达MongoDB之前,需要转换您的数据。


2
能否使用ORM框架将SQL数据映射到对象和集合中,然后将该数据存储到MongoDB中?这将解决连接的问题。 - Gurbakhshish Singh
2
这正是你应该做的,但它绝对不是原问题所要求的“容易”。 - Gates VP
是的,我需要将我的MySQL数据库转换为MongoDB,因为我的数据库中有更多数据。是否有任何用于转换数据库的Node.js脚本? - GaneSH
@GaneSH,你有没有得到任何Node.js脚本来转换数据库? - Sravan

22
如果您使用Ruby,您也可以尝试:Mongify。它是将关系型数据库数据转换为MongoDB的超级简单方法,而且不会丢失任何内容。Mongify可以读取您的Mysql数据库,为您构建一个转换文件,您只需要映射您想要转换的数据即可。它支持自动更新ID(到BSON ObjectID),更新引用ID,类型转换值,将表嵌入其他文档,保存前过滤器(手动更改数据),以及更多等功能。欲了解更多信息,请访问:http://mongify.com/getting_started.html。主页上还有一个短小的5分钟视频,向您展示了它有多容易。

1
嘿,编程容器。简而言之,它可以与MySQL配合使用,但是它使用的是RUBY(编程语言)。您需要在使用Mongify之前设置系统以运行ruby。 - Andrew K
你知道如果想要从WordPress MySQL环境转移到mongoDB/Angular堆栈,该怎么做吗? - Coded Container
是的,它应该可以。但是您需要使用Ruby来使用Mongify。一旦所有内容都转移到MongoDB上,您就不再需要Ruby了。 - Andrew K
但是使用mongify,您无法将mysql中的日期格式转换为mongo中的日期格式,而且二进制文件不起作用,二进制文件将被转换为字符串。如果mysql将0存储为二进制,则在mongo中的等效值将为'\u0000'。 - RKA
@RKA,Mongify支持将值修改为您想要的任何内容(只要mognodb驱动程序支持)。请阅读文档。 - Andrew K
你好,来自2015年的答案。那些链接无效,并且会带你去一个想要抓取数据的废弃网站。你可能会发现这个对你有用(我没有尝试过)在github上:https://github.com/anlek/mongify - KayCee

5

这是我使用Node.js完成此任务的方法:

var mysql = require('mysql');
var MongoClient = require('mongodb').MongoClient;

function getMysqlTables(mysqlConnection, callback) {
    mysqlConnection.query("show full tables where Table_Type = 'BASE TABLE';", function(error, results, fields) {
        if (error) {
            callback(error);
        } else {
            var tables = [];
            results.forEach(function (row) {
                for (var key in row) {
                    if (row.hasOwnProperty(key)) {
                        if(key.startsWith('Tables_in')) {
                            tables.push(row[key]);
                        }
                    }
                }
            });
            callback(null, tables);
        }
    });

}

function tableToCollection(mysqlConnection, tableName, mongoCollection, callback) {
    var sql = 'SELECT * FROM ' + tableName + ';';
    mysqlConnection.query(sql, function (error, results, fields) {
        if (error) {
            callback(error);
        } else {
            if (results.length > 0) {
                mongoCollection.insertMany(results, {}, function (error) {
                    if (error) {
                        callback(error);
                    } else {
                        callback(null);
                    }
                });
            } else {
                callback(null);
            }
        }
    });
}

MongoClient.connect("mongodb://localhost:27017/importedDb", function (error, db) {
    if (error) throw error;

    var MysqlCon = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'root',
        port: 8889,
        database: 'dbToExport'
    });

    MysqlCon.connect();

    var jobs = 0;

    getMysqlTables(MysqlCon, function(error, tables) {
        tables.forEach(function(table) {
            var collection = db.collection(table);
            ++jobs;
            tableToCollection(MysqlCon, table, collection, function(error) {
                if (error) throw error;
                --jobs;
            });
        })
    });

    // Waiting for all jobs to complete before closing databases connections.
    var interval = setInterval(function() {
        if(jobs<=0) {
            clearInterval(interval);
            console.log('done!');
            db.close();
            MysqlCon.end();
        }
    }, 300);
});

@benkadmin,请帮我解决这个问题。当我使用这段代码转换我的数据库时,出现了问题。我有136个SQL表,但如果我运行这个文件,我的桌面无法工作,只能转换69个表,之后桌面就不工作了,程序被终止。 - Abhishek

4

MongoVUE的免费版本可以自动为您完成此操作。

它可以连接到两个数据库并执行导入操作。


2
链接已损坏。 - Seyed Morteza Mousavi

3
我认为最简单的方法之一是将MySQL数据库导出为JSON,然后使用mongorestore将其导入MongoDB数据库。
步骤1:将MySQL数据库导出为JSON
如果需要,将mysql dump文件加载到MySQL数据库中。
打开MySQL Workbench并连接到MySQL数据库。
转到模式查看器>选择数据库>表>右键单击要导出的表的名称。
选择“表数据导出向导”。
将文件格式设置为.json,并输入文件名,例如tablename.json。
注意:所有表都需要单独导出。
步骤2:使用mongorestore命令将JSON文件导入MongoDB
mongorestore命令应该从服务器命令行(而不是mongo shell)运行。
请注意,您可能需要提供身份验证详细信息以及--jsonArray选项,请参阅mongorestore文档获取更多信息。
mongoimport -d dbname -u ${MONGO_USERNAME} -p ${MONGO_PASSWORD} --authenticationDatabase admin -c collectionname --jsonArray --file tablename.json

注意:如果原始的MySQL数据库具有BLOBs / 二进制数据,则此方法将无法工作。

1

对于这种迁移任务,我比较偏爱TalendOpenStudio。它是基于Eclipse的解决方案,可以以可视化的方式创建数据迁移“脚本”。虽然我不太喜欢可视化编程,但是在这个问题域中,我会例外。

Adrien Mogenet为MongoDB创建了一个MongoDBConnection插件。

如果只是一次性的简单迁移,那么可能会有些大材小用,但它确实是一个很酷的工具。

请注意,如果只是一次性迁移,Nix的建议可能会节省您的时间。


1

对于遇到同样问题的人,您可以查看这个Github项目。这是一个正在进行的开发,通过运行简单命令,将帮助您从MySQL数据库迁移数据到MongoDB。

它将生成TypeScript中的MongoDB模式,以便您稍后在项目中使用它们。每个MySQL表将成为MongoDB集合,并且数据类型将被有效地转换为其MongoDB兼容项。

可以在该项目的README.md中找到相关文档。欢迎加入并做出贡献。如果需要帮助,我们很乐意提供帮助。


1

您可以使用QCubed框架(http://qcu.be)来完成此操作。步骤如下:

  1. 安装QCubed(http://www.thetrozone.com/qcubed-installation
  2. 对数据库进行代码生成。(http://www.thetrozone.com/php-code-generation-qcubed-eliminating-sql-hassle)
  3. 将数据库从全球范围内脱机,以便一次只运行一个操作。
  4. 现在编写一个脚本,它将从数据库的所有表中读取所有行,并在所有对象上使用getJson来获取json。然后,您可以使用数据将其转换为数组并将其推入mongoDB!

1
如果还有人在寻找解决方案,我发现最简单的方法是编写一个PHP脚本连接到你的SQL数据库,使用通常的Select语句检索所需信息,使用PHP JSON Encode函数将信息转换为JSON,然后将结果直接输出到文件或直接输出到MongoDB。这实际上非常简单和直截了当,唯一需要做的就是仔细检查你的输出是否与Json验证器匹配,你可能需要使用函数如explode替换某些字符和符号以使其有效。我以前做过这个,但目前手头没有脚本,但从我记得的来看,它只有半页代码。
哦,还要记住,Mongo是一个文档存储库,因此需要进行一些数据映射才能使其与mongo兼容。

0

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