Để tìm các phần tử **chung** (giao nhau) giữa hai mảng trong cùng một tài liệu, MongoDB cung cấp toán tử $setIntersection trong Aggregation Pipeline. Toán tử này trả về mảng các giá trị xuất hiện trong **cả hai** mảng đầu vào (loại bỏ trùng lặp).
1. Tạo bộ sưu tập với 2 mảng
> db.demo61.insertOne({
"Values1": [10, 20, 30, 40, 50],
"Values2": [30, 100, 70, 120, 40]
});
{ "acknowledged": true, "insertedId": ObjectId("5e286e28cfb11e5c34d8992a") }
2. Xem dữ liệu
> db.demo61.find().pretty();
Kết quả:
{ "_id": ObjectId("..."), "Values1": [10, 20, 30, 40, 50], "Values2": [30, 100, 70, 120, 40] }
3. Aggregation: Tính giao nhau
> db.demo61.aggregate([
{
$project: {
BothValues: { $setIntersection: ["$Values1", "$Values2"] }
}
}
]);
4. Kết quả
{ "_id": ObjectId("..."), "BothValues": [30, 40] }
Các toán tử Set khác trong Aggregation:
$setUnion: Hợp (union) - tất cả phần tử duy nhất từ cả 2 mảng.$setDifference: Hiệu (difference) - phần tử ở mảng 1 nhưng không ở mảng 2.$setEquals: Kiểm tra 2 mảng có cùng phần tử (bỏ qua thứ tự, trùng lặp).$setIsSubset: Kiểm tra mảng 1 có phải tập con của mảng 2 không.$anyElementTrue,$allElementsTrue: Logic trên mảng boolean.
Lưu ý: $setIntersection loại bỏ duplicate và không giữ thứ tự.