0
0
Lập trình
TT

Kết hợp Hai Tập Tin JSON Có Mảng Lồng: Tối Ưu MongoDB và PostgreSQL

Đăng vào 5 tháng trước

• 9 phút đọc

Giới thiệu

Khi làm việc với dữ liệu JSON có cấu trúc lồng nhau, việc kết hợp hai nguồn dữ liệu là một thách thức thú vị. Trong bài viết này, chúng ta sẽ tìm hiểu cách kết hợp hai tập tin JSON có chứa mảng lồng nhau bằng cách sử dụng MongoDB và PostgreSQL. Chúng ta sẽ so sánh các phương pháp và tìm ra cách tối ưu nhất để thực hiện điều này.

Mô tả Vấn Đề

Giả sử bạn có hai bảng dữ liệu, một bảng được lưu trữ trên một máy chủ và một bảng trên máy chủ khác. Cả hai bảng đều có cấu trúc giống nhau và chứa các trường dữ liệu tương tự. Nhiệm vụ của chúng ta là kết hợp dữ liệu từ hai bảng này để thu được thống kê hàng ngày.

Ví dụ Về Dữ Liệu

Dưới đây là một ví dụ về dữ liệu từ hai nguồn:

Ngày Quầy thu ngân Tên sản phẩm Số lượng Nguồn
2025-09-01 2 name1 2 server_table
2
2025-09-01 2 name2 4 server_table
4
2025-09-01 3 name1 2 my_temp
2
2025-09-01 3 name2 4 my_temp
4
2025-09-01 4 name2 4 my_temp
2025-09-01 4 name2 8 server_table
12
2025-09-01 4 name8 12 my_temp
2025-09-01 4 name8 6 server_table
18

Dữ Liệu Mẫu Trong PostgreSQL

Chúng ta sẽ tạo hai bảng trong PostgreSQL:

sql Copy
CREATE TABLE my_temp (
    employee_id TEXT,
    date DATE,
    info JSONB
);

INSERT INTO my_temp (employee_id, date, info)
VALUES
(
    '3dd280f2-e4d3-4568-9d97-1cc3a9dff1e9',
    '2025-09-01',
    '[
        { "cash_register": 3,
          "products": [
            { "productName": "name1", "count": 2 },
            { "productName": "name2", "count": 4 }
          ]
        },
        { "cash_register": 4,
          "products": [
            { "productName": "name8", "count": 12 },
            { "productName": "name2", "count": 4 }
          ]
        }
     ]'
);

Dữ Liệu Mẫu Trong MongoDB

Tương tự, chúng ta sẽ tạo hai collection trong MongoDB:

javascript Copy
db.my_temp.insertMany([
  {
    employee_id: "3dd280f2-e4d3-4568-9d97-1cc3a9dff1e9",
    date: ISODate("2025-09-01"),
    info: [
      {
        cash_register: 3,
        products: [
          { productName: "name1", count: 2 },
          { productName: "name2", count: 4 }
        ]
      },
      {
        cash_register: 4,
        products: [
          { productName: "name8", count: 12 },
          { productName: "name2", count: 4 }
        ]
      }
    ]
  }
]);

Giải Pháp Trong MongoDB

Chúng ta sẽ sử dụng framework aggregation của MongoDB để kết hợp dữ liệu:

javascript Copy
db.my_temp.aggregate([
  { $unionWith: { coll: "server_table" } },
  { $unwind: "$info" },
  { $unwind: "$info.products" },
  { $group: {
      _id: {
        employee_id: "$employee_id",
        date: "$date",
        cash_register: "$info.cash_register",
        productName: "$info.products.productName"
      },
      total_count: { $sum: "$info.products.count" }
    }
  },
  { $group: {
      _id: {
        employee_id: "$_id.employee_id",
        date: "$_id.date",
        cash_register: "$_id.cash_register"
      },
      products: {
        $push: {
          productName: "$_id.productName",
          count: "$total_count"
        }
      }
    }
  },
  { $project: { _id: 0, employee_id: "$_id.employee_id", date: "$_id.date", info: 1 } },
  { $sort: { date: 1 } }
]);

Kết quả

Kết quả của truy vấn sẽ là một cấu trúc JSON với dữ liệu được kết hợp từ cả hai nguồn. Điều này cho phép chúng ta dễ dàng phân tích và thống kê dữ liệu.

Giải Pháp Trong PostgreSQL

Tương tự, chúng ta có thể sử dụng câu lệnh WITH để thực hiện việc kết hợp dữ liệu:

sql Copy
WITH
all_data AS (
    SELECT employee_id, "date", info FROM my_temp
    UNION ALL
    SELECT employee_id, "date", info FROM server_table
),
unwound AS (
    SELECT
        ad.employee_id,
        ad.date,
        (reg_elem->>'cash_register')::int AS cash_register,
        prod_elem->>'productName' AS product_name,
        (prod_elem->>'count')::int AS product_count
    FROM all_data ad
    CROSS JOIN LATERAL jsonb_array_elements(ad.info) AS reg_elem
    CROSS JOIN LATERAL jsonb_array_elements(reg_elem->'products') AS prod_elem
),
product_totals AS (
    SELECT
        employee_id,
        date,
        cash_register,
        product_name,
        SUM(product_count) AS total_count
    FROM unwound
    GROUP BY employee_id, date, cash_register, product_name
)
SELECT *
FROM product_totals
ORDER BY date;

Kết quả

Kết quả của truy vấn này cũng sẽ cho chúng ta thông tin tương tự như trong MongoDB.

Thực Hành Tốt Nhất

  • Đảm bảo cấu trúc dữ liệu: Khi làm việc với JSON, hãy chắc chắn rằng cấu trúc dữ liệu của bạn nhất quán để tránh lỗi trong quá trình truy vấn.
  • Tối ưu hóa hiệu suất: Sử dụng các chỉ số để tăng tốc độ truy vấn và giảm thiểu thời gian xử lý.

Câu Hỏi Thường Gặp

1. Có thể kết hợp nhiều nguồn dữ liệu khác nhau không?

Có, bạn có thể kết hợp nhiều nguồn dữ liệu miễn là chúng có cùng cấu trúc.

2. Làm thế nào để xử lý lỗi khi kết hợp dữ liệu?

Hãy kiểm tra kỹ dữ liệu trước khi thực hiện truy vấn và sử dụng các câu lệnh điều kiện để đảm bảo dữ liệu hợp lệ.

Kết luận

Việc kết hợp dữ liệu từ hai nguồn JSON có cấu trúc lồng nhau là một kỹ năng quan trọng trong phát triển ứng dụng. Bằng cách sử dụng MongoDB và PostgreSQL, bạn có thể dễ dàng thực hiện điều này. Hãy áp dụng các phương pháp và thực hành tốt nhất để tối ưu hóa quy trình của bạn. Nếu bạn có câu hỏi hoặc ý kiến, hãy để lại nhận xét bên dưới!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào