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
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
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
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
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!