如何从数据库导入 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
          }
},
  ...

转换成 Array 结构:
{
      "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() / 关闭连接
  2、调试执行,可看到格值 A3 为:
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 为:
A4 CLASS   STUDENTID SUBJECT
Class one 1 [84, 77, 69]
Class one 2 [81, 80, 97]
Class one 3 [75, 86, 67]
  格值 A5 为:
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

{
      "_id" : ObjectId("5feda0899f919c0b2c097b86"),
      "CLASS" : "Class one",
      "STUDENTID" : 1,
      "SUBJECT" : {
              "English" : 84,
            "Math" : 77,
              "PE" : 69
        }
}
......

courseArray

{
    "_id" :   ObjectId("5feda0899f919c0b2c097ba2"),
    "CLASS" : "Class   one",
    "STUDENTID" : 1,
    "SUBJECT" : [
        {
            "English" : 84
        },
        {
            "Math" : 77
        },
        {
            "PE" : 69
        }
    ]
}
  ......

A5:字段 SUBJECT 下存储的是记录而不是序表,因此需要取生成的序表中的首条记录;否则在 MongoDB 中生成的是 Array 下再嵌套 Map 的结构,不是我们预想要的。
对于带嵌套结构的数据,生成 json 格式导入 MongDB 数据库即可。