Die akzeptierte Antwort ist bei großen Sammlungen schrecklich langsam und gibt die _id
nicht zurück s der doppelten Datensätze.
Die Aggregation ist viel schneller und kann die _id
zurückgeben 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 }
]);
In der ersten Phase der Aggregationspipeline aggregiert der $groupoperator Dokumente nach name
Feld und speichert in uniqueIds
jede _id
Wert der gruppierten Datensätze. Der Operator $sum addiert die Werte der ihm übergebenen Felder, in diesem Fall die Konstante 1
- wodurch die Anzahl der gruppierten Datensätze in den count
gezählt wird Feld.
In der zweiten Phase der Pipeline verwenden wir $match, um Dokumente mit einem count
zu filtern von mindestens 2, also Duplikaten.
Dann sortieren wir zuerst die häufigsten Duplikate und begrenzen die Ergebnisse auf die Top 10.
Diese Abfrage gibt bis zu $limit
aus Datensätze mit doppelten Namen, zusammen mit ihrer _id
s. Zum Beispiel:
{
"_id" : {
"name" : "Toothpick"
},
"uniqueIds" : [
"xzuzJd2qatfJCSvkN",
"9bpewBsKbrGBQexv4",
"fi3Gscg9M64BQdArv",
],
"count" : 3
},
{
"_id" : {
"name" : "Broom"
},
"uniqueIds" : [
"3vwny3YEj2qBsmmhA",
"gJeWGcuX6Wk69oFYD"
],
"count" : 2
}