Liệt kê dữ liệu chung của hai bảng dựa trên khóa liên kết trong MongoDB
Hướng dẫn cách liệt kê dữ liệu chung của hai bảng trong MongoDB dựa trên khóa liên kết, sử dụng phương pháp aggregate để thực hiện các truy vấn hiệu quả.
Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng MongoDB để liệt kê dữ liệu chung của hai bảng (collection) thông qua khóa liên kết. Chúng ta sẽ sử dụng phương thức aggregate
để thực hiện các truy vấn phức tạp.
Mã MongoDB:
// Giả sử chúng ta có hai collection: 'users' và 'orders'
// 'users' có trường _id là khóa chính và 'orders' có trường userId liên kết với _id của 'users'
// Dữ liệu trong collection 'users'
db.users.insertMany([
{ _id: 1, name: "Alice" },
{ _id: 2, name: "Bob" },
{ _id: 3, name: "Charlie" }
]);
// Dữ liệu trong collection 'orders'
db.orders.insertMany([
{ orderId: 101, userId: 1, item: "Laptop" },
{ orderId: 102, userId: 2, item: "Phone" },
{ orderId: 103, userId: 1, item: "Tablet" }
]);
// Truy vấn để liệt kê dữ liệu chung của hai bảng
db.users.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "userId",
as: "user_orders"
}
},
{
$match: {
"user_orders": { $ne: [] }
}
}
]);
Giải thích chi tiết từng dòng code
-
Dữ liệu trong collection
users
: Tạo một collectionusers
với các trường_id
vàname
. -
Dữ liệu trong collection
orders
: Tạo một collectionorders
với các trườngorderId
,userId
(liên kết với_id
củausers
), vàitem
. -
Truy vấn
aggregate
:-
$lookup
: Kết nối (join) hai collection.from
chỉ định collection cần kết nối,localField
là trường trong collection hiện tại (users
),foreignField
là trường trong collection được kết nối (orders
), vàas
chỉ định tên của mảng kết quả. -
$match
: Lọc các bản ghi có chứa mảnguser_orders
không rỗng, tức là chỉ lấy các người dùng có đơn hàng.
-
Yêu cầu hệ thống:
- MongoDB 4.0 trở lên
Cách cài đặt MongoDB:
Có thể cài đặt MongoDB từ trang web chính thức MongoDB hoặc sử dụng các công cụ quản lý như MongoDB Compass.
Lời khuyên:
- Sử dụng
aggregate
với$lookup
cho phép bạn thực hiện các truy vấn phức tạp trong MongoDB, tương tự như JOIN trong SQL. - Đảm bảo đã tạo các chỉ mục trên các trường được sử dụng trong truy vấn để tối ưu hóa hiệu suất.