Sử dụng Aggregation Framework với $group, $match, $sort để tìm document trùng lặp theo trường khóa.
Ví dụ minh họa
Tạo collection findDuplicateByKeyDemo:
> db.findDuplicateByKeyDemo.insertOne({"MaSinhVien": 1, "TenSinhVien": "John"});
> db.findDuplicateByKeyDemo.insertOne({"MaSinhVien": 2, "TenSinhVien": "Carol"});
> db.findDuplicateByKeyDemo.insertOne({"MaSinhVien": 3, "TenSinhVien": "Carol"});
> db.findDuplicateByKeyDemo.insertOne({"MaSinhVien": 4, "TenSinhVien": "John"});
> db.findDuplicateByKeyDemo.insertOne({"MaSinhVien": 5, "TenSinhVien": "Sam"});
> db.findDuplicateByKeyDemo.insertOne({"MaSinhVien": 6, "TenSinhVien": "Carol"});
Truy vấn aggregation
> db.findDuplicateByKeyDemo.aggregate([
{$group: {
_id: {TenSinhVien: "$TenSinhVien"},
CacId: {$addToSet: "$_id"},
Dem: {$sum: 1}
}},
{$match: {Dem: {$gte: 2}}},
{$sort: {Dem: -1}},
{$limit: 10}
]).pretty();
Kết quả:
{ "_id": {"TenSinhVien": "Carol"}, "CacId": [ObjectId("..."), ObjectId("..."), ObjectId("...")], "Dem": 3 }
{ "_id": {"TenSinhVien": "John"}, "CacId": [ObjectId("..."), ObjectId("...")], "Dem": 2 }
Giải thích: Nhóm theo TenSinhVien, thu thập _id ($addToSet), đếm ($sum: 1), lọc nhóm có đếm ≥ 2, sắp xếp giảm dần, giới hạn 10.