Liệt kê dữ liệu chỉ có ở bảng table1 mà không có ở bảng table2 trong MongoDB
Hướng dẫn cách liệt kê dữ liệu chỉ có ở bảng `table1` mà không có ở bảng `table2` trong MongoDB, sử dụng phương pháp aggregate và các thao tác lọc.
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 chỉ có ở bảng table1
mà không có ở bảng table2
. Chúng ta sẽ sử dụng phương thức aggregate
kết hợp với $lookup
và $match
để thực hiện các truy vấn cần thiết.
Mã MongoDB:
// Giả sử chúng ta có hai collection: 'table1' và 'table2'
// Dữ liệu trong collection 'table1'
db.table1.insertMany([
{ _id: 1, name: "Alice" },
{ _id: 2, name: "Bob" },
{ _id: 3, name: "Charlie" }
]);
// Dữ liệu trong collection 'table2'
db.table2.insertMany([
{ _id: 1, name: "Alice" },
{ _id: 2, name: "David" }
]);
// Truy vấn để liệt kê dữ liệu chỉ có ở table1
db.table1.aggregate([
{
$lookup: {
from: "table2",
localField: "name",
foreignField: "name",
as: "matched_data"
}
},
{
$match: {
"matched_data": { $eq: [] }
}
},
{
$project: {
_id: 1,
name: 1
}
}
]);
Giải thích chi tiết từng dòng code
-
Dữ liệu trong collection
table1
: Tạo một collectiontable1
với các trường_id
vàname
. -
Dữ liệu trong collection
table2
: Tạo một collectiontable2
với các trường_id
vàname
. -
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 (table1
),foreignField
là trường trong collection được kết nối (table2
), vàas
chỉ định tên của mảng kết quả (matched_data
). -
$match
: Lọc các bản ghi trongtable1
mà không có sự kết nối (matched data) vớitable2
, tức là chỉ lấy các bản ghi mà mảngmatched_data
rỗng. -
$project
: Chỉ định các trường cần hiển thị trong kết quả cuối cùng, ở đây chỉ lấy_id
vàname
.
-
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
để thực hiện các truy vấn phức tạp và để lọc dữ liệu hiệu quả. - Nên tạo chỉ mục trên các trường được sử dụng trong truy vấn để tăng tốc độ truy vấn.