Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Gộp hai trường mảng trong MongoDB

Để 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ăngVí dụ
$setIntersectionGiao (phần tử chung){$setUnion: ["$A", "$B"]}
$setDifferenceHiệu (A - B){$setDifference: ["$A", "$B"]}
$setIsSubsetKiểm tra A ⊆ BTrả về true/false
$setEqualsKiểm tra A = BTrả về true/false
$anyElementTrueCó phần tử true nào khôngDành cho mảng boolean
$allElementsTrueTất cả phần tử trueDà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