MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Finden Sie alle doppelten Dokumente in einer MongoDB-Sammlung anhand eines Schlüsselfelds

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
}