Để gộp (merge) hai trường mảng thành một mảng mới không trùng lặp, MongoDB Aggregation Framework cung cấp toán tử $setUnion. Toán tử này trả về mảng chứa tất cả phần tử duy nhất từ các mảng đầu vào.
Tạo dữ liệu mẫu
> db.mergeTwoArrayFieldDemo.insertOne({"NaturalNumbers":[1,2,3,8,10,20,30],"WholeNumbers":[0,1,2,63,78,20,45]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd68e4057806ebf1256f11d") }
Xem dữ liệu
> db.mergeTwoArrayFieldDemo.find().pretty();
Gộp hai mảng với $setUnion
> db.mergeTwoArrayFieldDemo.aggregate([ { "$project": { "MergedArray": { "$setUnion": [ "$NaturalNumbers", "$WholeNumbers" ] } }} ]);Kết quả
Giải thích
$setUnion: Thực hiện phép hợp (union) của các tập hợp - loại bỏ trùng lặp- Kết quả được sắp xếp tự động (theo thứ tự BSON: null, số, chuỗi, object, mảng, v.v.)
- Các giá trị trùng lặp (1, 2, 20) chỉ xuất hiện một lần
- Không thay đổi dữ liệu gốc, chỉ tính toán trong pipeline
Các toán tử tập hợp (Set Operators) khác
| Toán tử | Chức năng | Ví dụ |
|---|---|---|
$setIntersection | Giao (phần tử chung) | {$setUnion: ["$A", "$B"]} |
$setDifference | Hiệu (A - B) | {$setDifference: ["$A", "$B"]} |
$setIsSubset | Kiểm tra A ⊆ B | Trả về true/false |
$setEquals | Kiểm tra A = B | Trả về true/false |
$anyElementTrue | Có phần tử true nào không | Dành cho mảng boolean |
$allElementsTrue | Tất cả phần tử true | Dành cho mảng boolean |
Ví dụ $setIntersection (phần tử chung)
db.mergeTwoArrayFieldDemo.aggregate([
{$project: {CommonNumbers: {$setIntersection: ["$NaturalNumbers", "$WholeNumbers"]}}}
]);
Ví dụ $setDifference (có trong A nhưng không trong B)
db.mergeTwoArrayFieldDemo.aggregate([ {$project: {OnlyInNatural: {$setDifference: ["$NaturalNumbers", "$WholeNumbers"]}}} ]);Lưu ý
- Các toán tử set yêu cầu đầu vào là mảng
- Nếu trường không tồn tại hoặc null, coi như mảng rỗng
- Kết quả không bảo toàn thứ tự gốc của mảng đầu vào
- Để gộp mảng và Giữ trùng lặp: dùng
$concatArrays