Sử dụng $unwind, $group, $match để phát hiện phần tử trùng
Quy trình: bẻ mảng, nhóm theo giá trị và đếm, lọc nhóm có count > 1.
Dữ liệu mẫu
> db.demo756.insertMany([
{ SubjectName: ["MySQL", "MongoDB", "Java"] },
{ SubjectName: ["MongoDB", "MySQL", "MongoDB", "C", "C+", "MySQL"] }
]);
Truy vấn tìm phần tử trùng lặp
db.demo756.aggregate([
{ $project: { SubjectName: 1 } },
{ $unwind: "$SubjectName" },
{ $group: { _id: { _id: "$_id", Name: "$SubjectName" }, count: { $sum: 1 } } },
{ $match: { count: { $gt: 1 } } },
{ $group: { _id: "$_id._id", SubjectName: { $addToSet: "$_id.Name" } } }
]);
Kết quả
{ "_id": ObjectId("5eb01e2b5637cd592b2a4ade"), "SubjectName": ["MongoDB", "MySQL"] }
Chỉ bản ghi thứ 2 có phần tử trùng lặp ("MongoDB" xuất hiện 2 lần, "MySQL" 2 lần). Bản ghi thứ 1 không có trùng lặp nên không xuất hiện trong kết quả.