Přijatá odpověď je u velkých kolekcí strašně pomalá a nevrací _id
s duplicitních záznamů.
Agregace je mnohem rychlejší a může vrátit _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 }
]);
V první fázi agregačního kanálu $groupoperator agreguje dokumenty podle name
pole a uloží se do uniqueIds
každé _id
hodnotu seskupených záznamů. Operátor $sum sečte hodnoty polí, která mu byla předána, v tomto případě konstantu 1
- tím se započítá počet seskupených záznamů do count
pole.
Ve druhé fázi kanálu používáme $match k filtrování dokumentů s count
alespoň 2, tj. duplikáty.
Poté nejprve seřadíme nejčastější duplikáty a omezíme výsledky na prvních 10.
Výstupem tohoto dotazu bude až $limit
záznamy s duplicitními názvy spolu s jejich _id
s. Například:
{
"_id" : {
"name" : "Toothpick"
},
"uniqueIds" : [
"xzuzJd2qatfJCSvkN",
"9bpewBsKbrGBQexv4",
"fi3Gscg9M64BQdArv",
],
"count" : 3
},
{
"_id" : {
"name" : "Broom"
},
"uniqueIds" : [
"3vwny3YEj2qBsmmhA",
"gJeWGcuX6Wk69oFYD"
],
"count" : 2
}