ETL练习_MongoDB工程订单表与支付订单表及MySQL目标表

一、概述

本练习涉及三个数据源的表结构:

  • MongoDB 工程订单表 (engineering_orders) - 源表A
  • MongoDB 支付订单表 (payment_orders) - 源表B,与工程订单表一对一关联
  • MySQL 工程订单表 (eng_order) - 目标表,与Mongo工程订单表字段基本一致但字段名不同

数据关系说明

工程订单表(主表)
    │
    ├── MongoDB 工程订单表 (engineering_orders)
    │       │
    │       └── relevancy_pay_id ──→ 关联 ──→ MongoDB 支付订单表 (payment_orders)
    │                                    (通过主表的relevancy_pay_id字段关联)
    │
    └── MySQL 工程订单表 (eng_order)
            │
            └── relevancy_pay_id ──→ 关联 ──→ MongoDB 支付订单表 (payment_orders)

二、MySQL 表结构 (目标表)

2.1 eng_order 工程订单表

字段名 类型 说明 示例值
order_id VARCHAR(32) 订单ID(主键) ENG2025010001
relevancy_pay_id VARCHAR(32) 关联支付ID PAY2025010001
project_code VARCHAR(64) 项目编码 PRJ20250001
project_name VARCHAR(200) 项目名称 某工厂智能化改造项目
customer_name VARCHAR(100) 客户名称 深圳市XX科技有限公司
contract_amount DECIMAL(15,2) 合同金额 500000.00
signed_date DATE 合同签订日期 2025-01-15
order_status TINYINT 订单状态(1-进行中 2-已完成 3-已取消) 1
sales_person VARCHAR(50) 销售人员 张三
department VARCHAR(50) 所属部门 工业智能化事业部
created_at DATETIME 创建时间 2025-01-15 09:30:00
updated_at DATETIME 更新时间 2025-01-15 09:30:00
CREATE TABLE eng_order (
    order_id VARCHAR(32) PRIMARY KEY,
    relevancy_pay_id VARCHAR(32) COMMENT '关联支付ID',
    project_code VARCHAR(64) NOT NULL,
    project_name VARCHAR(200) NOT NULL,
    customer_name VARCHAR(100),
    contract_amount DECIMAL(15,2) DEFAULT 0,
    signed_date DATE,
    order_status TINYINT DEFAULT 1 COMMENT '1-进行中 2-已完成 3-已取消',
    sales_person VARCHAR(50),
    department VARCHAR(50),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_project_code (project_code),
    INDEX idx_customer_name (customer_name),
    INDEX idx_order_status (order_status),
    INDEX idx_relevancy_pay_id (relevancy_pay_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工程订单表';

2.2 MySQL 示例数据

INSERT INTO eng_order (order_id, relevancy_pay_id, project_code, project_name, customer_name, contract_amount, signed_date, order_status, sales_person, department) VALUES
('ENG2025010001', 'PAY2025010001', 'PRJ20250001', '某工厂智能化改造项目', '深圳市XX科技有限公司', 500000.00, '2025-01-15', 1, '张三', '工业智能化事业部'),
('ENG2025010002', 'PAY2025010002', 'PRJ20250002', '数据中心建设方案', '广州YY集团', 850000.00, '2025-01-18', 1, '李四', '工业智能化事业部'),
('ENG2025010003', 'PAY2025010003', 'PRJ20250003', '生产线自动化升级', '东莞ZZ科技有限公司', 320000.00, '2025-01-20', 2, '王五', '工业智能化事业部'),
('ENG2025010004', 'PAY2025010004', 'PRJ20250004', '智能仓储系统部署', '佛山市ABC物流', 420000.00, '2025-02-01', 1, '张三', '工业智能化事业部'),
('ENG2025010005', 'PAY2025010005', 'PRJ20250005', '工业园区物联网平台', '惠州市DEF实业', 680000.00, '2025-02-10', 2, '赵六', '工业智能化事业部');

三、MongoDB 表结构 (源表)

3.1 engineering_orders 工程订单表

字段名 类型 说明 示例值
_id ObjectId 主键ID 65a1c2d3e4f5g6h7i8j9k0l1
eng_order_id String 工程订单编号 ENG2025010001
relevancy_pay_id String 关联支付ID(指向payment_orders) PAY2025010001
eng_project_code String 项目编号 PRJ20250001
eng_project_name String 项目名称 某工厂智能化改造项目
eng_customer String 客户单位 深圳市XX科技有限公司
eng_contract_money Decimal128 合同金额 NumberDecimal("500000.00")
eng_signing_date Date 签订日期 ISODate("2025-01-15")
eng_status Integer 订单状态(1-草稿 2-审批中 3-已签订 4-执行中 5-已完成 6-已终止) 3
eng_salesman String 业务员 张三
eng_dept String 部门 工业智能化事业部
eng_remark String 备注 重点客户项目
eng_source String 来源渠道(1-直销 2-渠道 3-投标) 1
eng_priority Integer 优先级(1-普通 2-重要 3-紧急) 2
eng_create_time Date 创建时间 ISODate("2025-01-15T09:30:00Z")
eng_update_time Date 更新时间 ISODate("2025-01-15T09:30:00Z")
// MongoDB 集合创建命令
db.createCollection("engineering_orders", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["eng_order_id", "eng_project_code", "eng_project_name"],
         properties: {
            eng_order_id: { bsonType: "string" },
            eng_project_code: { bsonType: "string" },
            eng_project_name: { bsonType: "string" }
         }
      }
   }
})

// 索引
db.engineering_orders.createIndex({ "eng_order_id": 1 }, { unique: true })
db.engineering_orders.createIndex({ "relevancy_pay_id": 1 })
db.engineering_orders.createIndex({ "eng_project_code": 1 })
db.engineering_orders.createIndex({ "eng_customer": 1 })
db.engineering_orders.createIndex({ "eng_status": 1 })

3.2 engineering_orders 示例数据

// 先清空集合(避免重复键冲突)
db.engineering_orders.deleteMany({})

db.engineering_orders.insertMany([
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a1"),
    eng_order_id: "ENG2025010001",
    relevancy_pay_id: "PAY2025010001",
    eng_project_code: "PRJ20250001",
    eng_project_name: "某工厂智能化改造项目",
    eng_customer: "深圳市XX科技有限公司",
    eng_contract_money: NumberDecimal("500000.00"),
    eng_signing_date: ISODate("2025-01-15"),
    eng_status: 3,
    eng_salesman: "张三",
    eng_dept: "工业智能化事业部",
    eng_remark: "重点客户项目",
    eng_source: 1,
    eng_priority: 2,
    eng_create_time: ISODate("2025-01-15T09:30:00Z"),
    eng_update_time: ISODate("2025-01-15T09:30:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a2"),
    eng_order_id: "ENG2025010002",
    relevancy_pay_id: "PAY2025010002",
    eng_project_code: "PRJ20250002",
    eng_project_name: "数据中心建设方案",
    eng_customer: "广州YY集团",
    eng_contract_money: NumberDecimal("850000.00"),
    eng_signing_date: ISODate("2025-01-18"),
    eng_status: 3,
    eng_salesman: "李四",
    eng_dept: "工业智能化事业部",
    eng_remark: "",
    eng_source: 2,
    eng_priority: 1,
    eng_create_time: ISODate("2025-01-18T10:00:00Z"),
    eng_update_time: ISODate("2025-01-18T10:00:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a3"),
    eng_order_id: "ENG2025010003",
    relevancy_pay_id: "PAY2025010003",
    eng_project_code: "PRJ20250003",
    eng_project_name: "生产线自动化升级",
    eng_customer: "东莞ZZ科技有限公司",
    eng_contract_money: NumberDecimal("320000.00"),
    eng_signing_date: ISODate("2025-01-20"),
    eng_status: 5,
    eng_salesman: "王五",
    eng_dept: "工业智能化事业部",
    eng_remark: "需配合甲方进度",
    eng_source: 1,
    eng_priority: 2,
    eng_create_time: ISODate("2025-01-20T14:20:00Z"),
    eng_update_time: ISODate("2025-02-28T16:00:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a4"),
    eng_order_id: "ENG2025010004",
    relevancy_pay_id: "PAY2025010004",
    eng_project_code: "PRJ20250004",
    eng_project_name: "智能仓储系统部署",
    eng_customer: "佛山市ABC物流",
    eng_contract_money: NumberDecimal("420000.00"),
    eng_signing_date: ISODate("2025-02-01"),
    eng_status: 3,
    eng_salesman: "张三",
    eng_dept: "工业智能化事业部",
    eng_remark: "",
    eng_source: 1,
    eng_priority: 1,
    eng_create_time: ISODate("2025-02-01T08:45:00Z"),
    eng_update_time: ISODate("2025-02-01T08:45:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a5"),
    eng_order_id: "ENG2025010005",
    relevancy_pay_id: "PAY2025010005",
    eng_project_code: "PRJ20250005",
    eng_project_name: "工业园区物联网平台",
    eng_customer: "惠州市DEF实业",
    eng_contract_money: NumberDecimal("680000.00"),
    eng_signing_date: ISODate("2025-02-10"),
    eng_status: 5,
    eng_salesman: "赵六",
    eng_dept: "工业智能化事业部",
    eng_remark: "年后重点跟进",
    eng_source: 3,
    eng_priority: 3,
    eng_create_time: ISODate("2025-02-10T11:30:00Z"),
    eng_update_time: ISODate("2025-03-15T09:00:00Z")
  },
  // ===== 以下为MySQL表中没有的额外记录 =====
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a6"),
    eng_order_id: "ENG2025010006",
    relevancy_pay_id: "PAY2025010006",
    eng_project_code: "PRJ20250006",
    eng_project_name: "智慧楼宇综合管理系统",
    eng_customer: "珠海市GHI投资",
    eng_contract_money: NumberDecimal("950000.00"),
    eng_signing_date: ISODate("2025-02-15"),
    eng_status: 3,
    eng_salesman: "孙七",
    eng_dept: "工业智能化事业部",
    eng_remark: "大型项目",
    eng_source: 1,
    eng_priority: 3,
    eng_create_time: ISODate("2025-02-15T10:00:00Z"),
    eng_update_time: ISODate("2025-02-15T10:00:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a7"),
    eng_order_id: "ENG2025010007",
    relevancy_pay_id: "PAY2025010007",
    eng_project_code: "PRJ20250007",
    eng_project_name: "工厂能耗监控平台",
    eng_customer: "中山市JKL制造",
    eng_contract_money: NumberDecimal("280000.00"),
    eng_signing_date: ISODate("2025-02-20"),
    eng_status: 4,
    eng_salesman: "周八",
    eng_dept: "工业智能化事业部",
    eng_remark: "",
    eng_source: 2,
    eng_priority: 1,
    eng_create_time: ISODate("2025-02-20T15:30:00Z"),
    eng_update_time: ISODate("2025-03-01T08:00:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a8"),
    eng_order_id: "ENG2025010008",
    relevancy_pay_id: "PAY2025010008",
    eng_project_code: "PRJ20250008",
    eng_project_name: "自动化生产线改造项目",
    eng_customer: "惠州市MN工业",
    eng_contract_money: NumberDecimal("560000.00"),
    eng_signing_date: ISODate("2025-03-01"),
    eng_status: 2,
    eng_salesman: "吴九",
    eng_dept: "工业智能化事业部",
    eng_remark: "审批中",
    eng_source: 1,
    eng_priority: 2,
    eng_create_time: ISODate("2025-03-01T09:00:00Z"),
    eng_update_time: ISODate("2025-03-05T14:00:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0a9"),
    eng_order_id: "ENG2025010009",
    relevancy_pay_id: "PAY2025010009",
    eng_project_code: "PRJ20250009",
    eng_project_name: "车间MES系统实施",
    eng_customer: "佛山市OPQ科技",
    eng_contract_money: NumberDecimal("780000.00"),
    eng_signing_date: ISODate("2025-03-05"),
    eng_status: 1,
    eng_salesman: "郑十",
    eng_dept: "工业智能化事业部",
    eng_remark: "草稿状态",
    eng_source: 3,
    eng_priority: 1,
    eng_create_time: ISODate("2025-03-05T16:00:00Z"),
    eng_update_time: ISODate("2025-03-05T16:00:00Z")
  },
  {
    _id: ObjectId("65a1c2d3e4f5a6b7c8d9e0b1"),
    eng_order_id: "ENG2025010010",
    relevancy_pay_id: "PAY2025010010",
    eng_project_code: "PRJ20250010",
    eng_project_name: "智能制造产业园信息化平台",
    eng_customer: "广州市RST集团",
    eng_contract_money: NumberDecimal("1200000.00"),
    eng_signing_date: ISODate("2025-03-10"),
    eng_status: 3,
    eng_salesman: "张三",
    eng_dept: "工业智能化事业部",
    eng_remark: "千万级大单",
    eng_source: 1,
    eng_priority: 3,
    eng_create_time: ISODate("2025-03-10T10:30:00Z"),
    eng_update_time: ISODate("2025-03-10T10:30:00Z")
  }
]);

3.3 payment_orders 支付订单表

字段名 类型 说明 示例值
_id ObjectId 主键ID 65b2d3e4f5g6h7i8j9k0l1
pay_order_no String 支付订单号(主键,唯一) PAY2025010001
pay_customer String 客户名称 深圳市XX科技有限公司
pay_type Integer 支付类型(1-预付款 2-进度款 3-验收款 4-质保金) 1
pay_total_amount Decimal128 支付总金额 NumberDecimal("500000.00")
pay_received_amount Decimal128 已到账金额 NumberDecimal("350000.00")
pay_plan_date Date 计划支付日期 ISODate("2025-01-20")
pay_actual_date Date 实际支付日期 ISODate("2025-01-18")
pay_status Integer 支付状态(1-待提交 2-审批中 3-已支付 4-已拒绝) 3
pay_method String 支付方式(转账/票据/现金) 转账
pay_bank String 开户银行 中国工商银行深圳分行
pay_account_no String 收款账号 4000123456789012345
pay_invoice_status Integer 发票状态(1-未开 2-已开 3-已收) 2
pay_invoice_no String 发票号码 INV20250001
pay_remark String 备注 首付款50%
pay_create_time Date 创建时间 ISODate("2025-01-16T10:00:00Z")
pay_update_time Date 更新时间 ISODate("2025-01-18T15:30:00Z")
// MongoDB 集合创建命令
db.createCollection("payment_orders", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["pay_order_no"],
         properties: {
            pay_order_no: { bsonType: "string" }
         }
      }
   }
})

// 索引
db.payment_orders.createIndex({ "pay_order_no": 1 }, { unique: true })

3.4 payment_orders 示例数据

// 先清空集合(避免重复键冲突)
db.payment_orders.deleteMany({})

db.payment_orders.insertMany([
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a1"),
    pay_order_no: "PAY2025010001",
    pay_customer: "深圳市XX科技有限公司",
    pay_type: 1,
    pay_total_amount: NumberDecimal("500000.00"),
    pay_received_amount: NumberDecimal("350000.00"),
    pay_plan_date: ISODate("2025-01-20"),
    pay_actual_date: ISODate("2025-01-18"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国工商银行深圳分行",
    pay_account_no: "4000123456789012345",
    pay_invoice_status: 2,
    pay_invoice_no: "INV20250001",
    pay_remark: "已到账35万,尾款15万待收",
    pay_create_time: ISODate("2025-01-16T10:00:00Z"),
    pay_update_time: ISODate("2025-03-14T15:30:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a2"),
    pay_order_no: "PAY2025010002",
    pay_customer: "广州YY集团",
    pay_type: 2,
    pay_total_amount: NumberDecimal("850000.00"),
    pay_received_amount: NumberDecimal("255000.00"),
    pay_plan_date: ISODate("2025-01-25"),
    pay_actual_date: ISODate("2025-01-24"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国建设银行广州分行",
    pay_account_no: "6217123456789012345",
    pay_invoice_status: 2,
    pay_invoice_no: "INV20250003",
    pay_remark: "已到账25.5万,进度款59.5万待收",
    pay_create_time: ISODate("2025-01-19T14:00:00Z"),
    pay_update_time: ISODate("2025-03-15T10:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a3"),
    pay_order_no: "PAY2025010003",
    pay_customer: "东莞ZZ科技有限公司",
    pay_type: 3,
    pay_total_amount: NumberDecimal("320000.00"),
    pay_received_amount: NumberDecimal("320000.00"),
    pay_plan_date: ISODate("2025-01-28"),
    pay_actual_date: ISODate("2025-01-27"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国农业银行东莞分行",
    pay_account_no: "6228123456789012345",
    pay_invoice_status: 2,
    pay_invoice_no: "INV20250004",
    pay_remark: "已全额到账",
    pay_create_time: ISODate("2025-01-21T11:00:00Z"),
    pay_update_time: ISODate("2025-02-28T16:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a4"),
    pay_order_no: "PAY2025010004",
    pay_customer: "佛山市ABC物流",
    pay_type: 1,
    pay_total_amount: NumberDecimal("420000.00"),
    pay_received_amount: NumberDecimal("336000.00"),
    pay_plan_date: ISODate("2025-02-10"),
    pay_actual_date: ISODate("2025-02-09"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国银行佛山分行",
    pay_account_no: "6219851234567890123",
    pay_invoice_status: 2,
    pay_invoice_no: "INV20250005",
    pay_remark: "已到账33.6万,尾款8.4万待收",
    pay_create_time: ISODate("2025-02-02T09:00:00Z"),
    pay_update_time: ISODate("2025-04-12T16:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a5"),
    pay_order_no: "PAY2025010005",
    pay_customer: "惠州市DEF实业",
    pay_type: 4,
    pay_total_amount: NumberDecimal("680000.00"),
    pay_received_amount: NumberDecimal("680000.00"),
    pay_plan_date: ISODate("2025-02-15"),
    pay_actual_date: ISODate("2025-06-28"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国工商银行惠州分行",
    pay_account_no: "6210991234567890123",
    pay_invoice_status: 3,
    pay_invoice_no: "INV20250009",
    pay_remark: "已全额到账",
    pay_create_time: ISODate("2025-02-11T10:00:00Z"),
    pay_update_time: ISODate("2025-06-28T09:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a6"),
    pay_order_no: "PAY2025010006",
    pay_customer: "珠海市GHI投资",
    pay_type: 1,
    pay_total_amount: NumberDecimal("950000.00"),
    pay_received_amount: NumberDecimal("285000.00"),
    pay_plan_date: ISODate("2025-02-20"),
    pay_actual_date: ISODate("2025-02-19"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国建设银行珠海分行",
    pay_account_no: "6222123456789012345",
    pay_invoice_status: 2,
    pay_invoice_no: "INV20250010",
    pay_remark: "已到账28.5万,大额尾款待收",
    pay_create_time: ISODate("2025-02-16T11:00:00Z"),
    pay_update_time: ISODate("2025-02-19T14:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a7"),
    pay_order_no: "PAY2025010007",
    pay_customer: "中山市JKL制造",
    pay_type: 1,
    pay_total_amount: NumberDecimal("280000.00"),
    pay_received_amount: NumberDecimal("84000.00"),
    pay_plan_date: ISODate("2025-02-28"),
    pay_actual_date: ISODate("2025-02-27"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国农业银行中山分行",
    pay_account_no: "6229123456789012345",
    pay_invoice_status: 2,
    pay_invoice_no: "INV20250011",
    pay_remark: "已到账8.4万,尾款19.6万待收",
    pay_create_time: ISODate("2025-02-21T10:00:00Z"),
    pay_update_time: ISODate("2025-03-01T08:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a8"),
    pay_order_no: "PAY2025010008",
    pay_customer: "惠州市MN工业",
    pay_type: 1,
    pay_total_amount: NumberDecimal("560000.00"),
    pay_received_amount: NumberDecimal("0"),
    pay_plan_date: ISODate("2025-03-15"),
    pay_actual_date: null,
    pay_status: 2,
    pay_method: "转账",
    pay_bank: "中国工商银行惠州分行",
    pay_account_no: "6210991234567890456",
    pay_invoice_status: 1,
    pay_invoice_no: "",
    pay_remark: "审批中,尚未到账",
    pay_create_time: ISODate("2025-03-02T11:00:00Z"),
    pay_update_time: ISODate("2025-03-05T09:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0a9"),
    pay_order_no: "PAY2025010009",
    pay_customer: "佛山市OPQ科技",
    pay_type: 1,
    pay_total_amount: NumberDecimal("780000.00"),
    pay_received_amount: NumberDecimal("0"),
    pay_plan_date: ISODate("2025-03-20"),
    pay_actual_date: null,
    pay_status: 1,
    pay_method: "",
    pay_bank: "",
    pay_account_no: "",
    pay_invoice_status: 1,
    pay_invoice_no: "",
    pay_remark: "草稿,待提交",
    pay_create_time: ISODate("2025-03-06T10:00:00Z"),
    pay_update_time: ISODate("2025-03-06T10:00:00Z")
  },
  {
    _id: ObjectId("65b2d3e4f5a6b7c8d9f0b1"),
    pay_order_no: "PAY2025010010",
    pay_customer: "广州市RST集团",
    pay_type: 1,
    pay_total_amount: NumberDecimal("1200000.00"),
    pay_received_amount: NumberDecimal("360000.00"),
    pay_plan_date: ISODate("2025-03-15"),
    pay_actual_date: ISODate("2025-03-14"),
    pay_status: 3,
    pay_method: "转账",
    pay_bank: "中国工商银行广州分行",
    pay_account_no: "6210991234567890789",
    pay_invoice_status: 2,
    pay_invoice_no: "INV20250012",
    pay_remark: "已到账36万,大额尾款84万待收",
    pay_create_time: ISODate("2025-03-11T10:00:00Z"),
    pay_update_time: ISODate("2025-04-15T09:00:00Z")
  }
]);

四、字段映射关系

4.1 MongoDB 工程订单表 → MySQL 工程订单表

MongoDB 字段名 MongoDB 示例值 MySQL 字段名 MySQL 示例值 转换说明
eng_order_id ENG2025010001 order_id ENG2025010001 直接映射
relevancy_pay_id PAY2025010001 relevancy_pay_id PAY2025010001 直接映射
eng_project_code PRJ20250001 project_code PRJ20250001 直接映射
eng_project_name 某工厂智能化改造项目 project_name 某工厂智能化改造项目 直接映射
eng_customer 深圳市XX科技有限公司 customer_name 深圳市XX科技有限公司 重命名
eng_contract_money NumberDecimal("500000.00") contract_amount 500000.00 重命名,Decimal128转Decimal
eng_signing_date ISODate("2025-01-15") signed_date 2025-01-15 重命名,Date转Date
eng_status 3 order_status 1 值映射:3→1, 5→2, 6→3
eng_salesman 张三 sales_person 张三 重命名
eng_dept 工业智能化事业部 department 工业智能化事业部 重命名
eng_create_time ISODate("2025-01-15T09:30:00Z") created_at 2025-01-15 09:30:00 重命名
eng_update_time ISODate("2025-01-15T09:30:00Z") updated_at 2025-01-15 09:30:00 重命名

4.2 状态值映射规则

MongoDB eng_status 含义 MySQL order_status 含义
1 草稿 (不处理) -
2 审批中 (不处理) -
3 已签订 1 进行中
4 执行中 1 进行中
5 已完成 2 已完成
6 已终止 3 已取消

五、数据统计

5.1 数据量对比

数据源 记录数 说明
MongoDB 工程订单表 10条 包含所有工程订单
MongoDB 支付订单表 10条 每个工程订单对应一条支付记录
MySQL 工程订单表 5条 MongoDB工程订单的子集

5.2 支付记录统计

工程订单号 支付状态 合同金额 已到账 备注
ENG2025010001 已支付 500,000 350,000 部分到账
ENG2025010002 已支付 850,000 255,000 部分到账
ENG2025010003 已支付 320,000 320,000 全额到账
ENG2025010004 已支付 420,000 336,000 部分到账
ENG2025010005 已支付 680,000 680,000 全额到账
ENG2025010006 已支付 950,000 285,000 部分到账
ENG2025010007 已支付 280,000 84,000 部分到账
ENG2025010008 审批中 560,000 0 尚未到账
ENG2025010009 待提交 780,000 0 草稿
ENG2025010010 已支付 1,200,000 360,000 部分到账

六、ETL练习任务

任务1:全量同步(首次同步)

将MongoDB工程订单表中的eng_status=3或4或5或6的记录,同步到MySQL工程订单表。

任务2:增量同步(定时任务)

每天定时同步新增或变化的工程订单记录。

任务3:数据清洗与转换

  • 处理Decimal128类型转换
  • 处理状态码映射
  • 处理日期格式转换
  • 处理支付订单表的合同金额与工程订单表的一致性校验

任务4:数据验证

验证同步后数据的完整性和准确性。

任务5:支付关联查询

基于一对一关系,查询工程订单及其对应的支付信息。


七、数据库连接信息(示例)

MySQL

host: localhost
port: 3306
database: etl_practice
username: root
password: password

MongoDB

host: localhost
port: 27017
database: etl_practice
username: root
password: password
posted @ 2026-05-15 15:02  RK5123153  阅读(5)  评论(0)    收藏  举报