把MongoDB中的数据复制到MySQL中
我刚刚更新了用于标题的库“Momy”,所以我想趁忘记之前写一篇文章。(更新的主要内容是添加了测试)
由于MongoDB是一种NoSQL文件数据库,所以它没有基本的模式。然而,与CouchDB不同,MongoDB有一个”集合”的概念。因此,虽然有些勉强,但是如果将集合映射为SQL的表,就可以相对容易地实现从MongoDB到MySQL的单向复制。
如果保持 MongoDB 不变,它与 Microsoft Access 和其他办公软件工具的连接会比较困难。但是,如果将数据迁移到 MySQL,就可以使用各种工具和驱动程序。目前,有两个工具可用于从 MongoDB 复制到关系型数据库(RDB)(可能还有其他的)。
如果你使用PostgreSQL,可以使用MoSQL。此外,根据使用的目的,还可以考虑选择Apache Drill等工具。
妈妈的安装
可以从npm获取。
$ npm install -g momy
模式配置
虽然是无模式的,但实际上应用程序应该在一定程度上定义了结构。将这个”模式”设置在momyfile.json文件中。基本上,我们需要指定MongoDB(源)和MySQL(目标)数据库,并为每个集合写入字段名和其类型即可。
{
"src": "mongodb://localhost:27017/myapp",
"dist": "mysql://root@localhost:3306/myapp",
"collections": {
"contacts": {
"_id": "string",
"createdAt": "DATETIME",
"lastName": "string",
"firstName": "string",
"code": "number",
"birthday": "DATE",
"address.state": "string",
"address.city": "string",
"address.street": "string"
},
"meetings": {
"_id": "string",
"createdAt": "DATETIME",
"date": "DATE",
"title": "string",
"description": "TEXT"
}
}
}
指定数据库
将同期源数据库设置为”src”,同步目标数据库设置为”dist”。
“src”: “mongodb://localhost:27017/myapp” 必ずMongoDBを指定
“dist”: “mysql://root@localhost:3306/myapp” 必ずMySQLを指定
数据库的URL遵循以下格式。
データベースの種類://ユーザ名:パスワード@サーバ名:ポート/データベース名
收藏
大致上,就像你所看到的一样,但具体请看附录。
MongoDB的准备工作
母親使用MongoDB的副本集信息。因此,在单机模式下的MongoDB无法进行复制。请按照以下方式启动并开启副本集。
$ mongod --replSet "rs0" --oplogSize 100
从另一个终端打开mongo shell,并初始化副本集(rs.initiate())。请仅在首次执行此命令。这样,副本集就在这个数据库中变为活动状态。
$ mongo
....
> rs.initiate()
执行
在第一次运行时,需要使用–import参数。
$ momy --config momyfile.json --import
如果启用此选项,将根据momyfile.json文件的模式创建MySQL表格,并将MongoDB上的现有文档复制到MySQL中。
当复制完成后,将监视MongoDB并实现与MySQL的实时同步。要退出,请按下Ctl+X。
从第二次开始
$ momy --config momyfile.json
只需要”OK”。如果想在服务器等地方确保持续同步,推荐使用”forever”。
$ forever momy --config momyfile.json
如果不幸发生momy崩溃的情况,它会重新启动并继续执行。
最后
请参考去年的文章了解有关图书馆创建的背景等。关于详细的使用方法,请参考Momy的存储库。那么,我们就这样吧。
附录
设置收藏品
在momyfile.json文件中,我们使用以下格式来指定集合名称和字段设置。
{
"コレクション名": {
"_id": "string あるいは number",
"フィールド名1": "フィールドの型",
"フィールド名2": "フィールドの型",
...
}
}
_id字段是必需的。在将其传输到MySQL时,它将成为主键。
使用点符号可以在字段名称中获取嵌套的值。例如:
{a:{b:{c: ‘Hey!’}}} というデータがあったら、a.b.cで’Hey!’を取得。
{address: {state: ‘東京’, city: ‘世田谷’, street: ‘代田’}} というデータがあったら、address.stateで’東京’を取得。
字段的类型 de katachi)
作为类型,可以使用以下内容。
-
- BIGINT
-
- DOUBLE
-
- TINYINT
-
- VARCHAR
-
- DATE
-
- DATETIME
-
- TIME
- TEXT
备注:如果有任何缺失的类型,请提出问题或发起拉取请求。
作为替代,也可以使用以下表达方式。
string: VARCHARに同じ
number: DOUBLEに同じ
boolean: TINYINTに同じ
日期型
DATE型和DATETIME型可以接受字符串形式例如”2016-11-13″,也可以接受时间戳(毫秒)。如果指定了DATE类型,无论MongoDB上的值是什么,传递给MySQL的值都将是”2016-11-13″。
“2016-11-13 01:14:28” (文字列)
“2016-11-13T01:14:28” (文字列)
“20161113T011428” (文字列)
1478967268294 (数値)
数字类型
BIGINTを指定した場合、小数点以下はparseInt()で丸められます。
DOUBLEを指定した場合、parseFloat()で解釈されます。
字符串类型
VARCHARは、実際にはVARCHAR(255)です。255文字以上の場合は、トランケートされます。
TEXTには、明確な文字数制限がありません。