Câu trả lời được chấp nhận rất chậm trên các bộ sưu tập lớn và không trả về _id
các bản ghi trùng lặp.
Tổng hợp nhanh hơn nhiều và có thể trả về _id
s:
db.collection.aggregate([
{ $group: {
_id: { name: "$name" }, // replace `name` here twice
uniqueIds: { $addToSet: "$_id" },
count: { $sum: 1 }
} },
{ $match: {
count: { $gte: 2 }
} },
{ $sort : { count : -1} },
{ $limit : 10 }
]);
Trong giai đoạn đầu tiên của quy trình tổng hợp, $ groupoperator tổng hợp các tài liệu theo name
trường và lưu trữ trong uniqueIds
mỗi _id
giá trị của các bản ghi được nhóm lại. Toán tử $ sum sẽ cộng các giá trị của các trường được chuyển đến nó, trong trường hợp này là hằng số 1
- do đó đếm số lượng bản ghi được nhóm vào count
trường.
Trong giai đoạn thứ hai của quy trình, chúng tôi sử dụng $ matchto lọc các tài liệu có count
trong số ít nhất 2, tức là các bản sao.
Sau đó, chúng tôi sắp xếp các bản sao thường xuyên nhất trước tiên và giới hạn các kết quả ở top 10.
Truy vấn này sẽ xuất ra tối đa $limit
các bản ghi có tên trùng lặp, cùng với _id
của chúng S. Ví dụ:
{
"_id" : {
"name" : "Toothpick"
},
"uniqueIds" : [
"xzuzJd2qatfJCSvkN",
"9bpewBsKbrGBQexv4",
"fi3Gscg9M64BQdArv",
],
"count" : 3
},
{
"_id" : {
"name" : "Broom"
},
"uniqueIds" : [
"3vwny3YEj2qBsmmhA",
"gJeWGcuX6Wk69oFYD"
],
"count" : 2
}