Jawaban yang diterima sangat lambat pada koleksi besar, dan tidak mengembalikan _id
s dari catatan duplikat.
Agregasi jauh lebih cepat dan dapat mengembalikan _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 }
]);
Pada tahap pertama dari alur agregasi, $groupoperator mengumpulkan dokumen dengan name
bidang dan simpan di uniqueIds
setiap _id
nilai catatan yang dikelompokkan. Operator $sum menjumlahkan nilai bidang yang diteruskan ke sana, dalam hal ini konstanta 1
- dengan demikian menghitung jumlah record yang dikelompokkan ke dalam count
lapangan.
Pada tahap kedua dari pipeline, kami menggunakan $matchuntuk memfilter dokumen dengan count
minimal 2, yaitu duplikat.
Kemudian, kami mengurutkan duplikat yang paling sering terlebih dahulu, dan membatasi hasilnya hingga 10 teratas.
Kueri ini akan menghasilkan hingga $limit
catatan dengan nama duplikat, bersama dengan _id
their s. Misalnya:
{
"_id" : {
"name" : "Toothpick"
},
"uniqueIds" : [
"xzuzJd2qatfJCSvkN",
"9bpewBsKbrGBQexv4",
"fi3Gscg9M64BQdArv",
],
"count" : 3
},
{
"_id" : {
"name" : "Broom"
},
"uniqueIds" : [
"3vwny3YEj2qBsmmhA",
"gJeWGcuX6Wk69oFYD"
],
"count" : 2
}