如何从数据库导入 MongoDB
将数据库的表数据导入 MongoDB 中,对表结构能实现子文档关系的,且按 MongoDB 嵌套结构规范导入。MongoDB 基本的嵌套结构有两种,分别是 Map 结构形式与 Array 结构形式,其它多层嵌套结构均是在这两种基本结构的基础上组合而成。
下面以 mysql 数据库为例说明,如有表 scores 成绩数据表,每个学生的成绩,即字段 SUBJECT, SCORE 可转换成子文档关系,数据如下:
CLASS | STUDENTID | SUBJECT | SCORE |
Class one | 1 | English | 84 |
Class one | 1 | Math | 77 |
Class one | 1 | PE | 69 |
Class one | 2 | English | 81 |
Class one | 2 | Math | 80 |
… | … | … |
转换成 Map 结构:
{ "CLASS" : "Class one", "STUDENTID" : 1, "SUBJECT" : { "English" : 84, "Math" : 77, "PE" : 69 } }, ... |
{ "CLASS" : "Class one", "STUDENTID" : 1, "SUBJECT" : [ { English" : 84 }, { "Math" : 77 }, { "PE" : 69 } ] }, ... |
使用集算器, 可将表数据转换成嵌套结构后导入 MongoDB 中,实现比较容易。
1、编写脚本 scores.dfx:
A | B | |
1 | =connect("mysql") | / 连接 mysql 数据库 |
2 | =A1.query@x("select * from scores") | / 获取 scores 表数据 |
3 | =A2.pivot(CLASS, STUDENTID; SUBJECT, SCORE) | / 成绩行转换成列 |
4 | =A3.new(CLASS, STUDENTID, create(English, Math, PE). record(~.array().to(3,))(1):SUBJECT ) | / 将成绩转换成 Map 结构 |
5 | =A2.group(CLASS, STUDENTID; ~.eval("create(" +SUBJECT+")").insert(0, SCORE)(1) ):SUBJECT) |
/ 将成绩转换成 Array 结构 |
6 | =mongo_open("mongodb://localhost:27017/raqdb") | / 连接 MongoDB 数据库 |
7 | >mongo_insert(A6, "courseMap", json(A4)) | / 导入 courseMap 集合 |
8 | >mongo_insert(A6, "courseArray", json(A5)) | / 导入 courseArray 集合 |
9 | >A5.close() | / 关闭连接 |
A3 | CLASS | STUDENTID | English | Math | PE |
Class one | 1 | 84 | 77 | 69 | |
Class one | 2 | 81 | 80 | 97 | |
Class one | 3 | 75 | 86 | 67 | |
… | … | … |
A4 | CLASS | STUDENTID | SUBJECT |
Class one | 1 | [84, 77, 69] | |
Class one | 2 | [81, 80, 97] | |
Class one | 3 | [75, 86, 67] | |
… | … | … |
A5 | CLASS | STUDENTID | SUBJECT |
Class one | 1 | [[84], [77], [69]] | |
Class one | 2 | [[81], [80], [97]] | |
Class one | 3 | [[75], [86], [67]] | |
… | … | … |
3、执行脚本后,在 MongoDB 下查询结果为:
courseMap | { |
courseArray | { |
A5:字段 SUBJECT 下存储的是记录而不是序表,因此需要取生成的序表中的首条记录;否则在 MongoDB 中生成的是 Array 下再嵌套 Map 的结构,不是我们预想要的。
对于带嵌套结构的数据,生成 json 格式导入 MongDB 数据库即可。
英文版