sql >> Database >  >> NoSQL >> MongoDB

Vind alle dubbele documenten in een MongoDB-verzameling op een sleutelveld

Het geaccepteerde antwoord is erg traag bij grote collecties en retourneert niet de _id s van de dubbele records.

Aggregatie is veel sneller en kan de _id . retourneren 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 de eerste fase van de aggregatiepijplijn verzamelt de $groupoperator documenten met de name veld en slaat op in uniqueIds elke _id waarde van de gegroepeerde records. De $sum-operator telt de waarden op van de velden die eraan zijn doorgegeven, in dit geval de constante 1 - daarbij het aantal gegroepeerde records tellen in de count veld.

In de tweede fase van de pijplijn gebruiken we $matchto om documenten te filteren met een count van minimaal 2, d.w.z. duplicaten.

Vervolgens sorteren we de meest voorkomende duplicaten eerst en beperken we de resultaten tot de top 10.

Deze zoekopdracht levert maximaal $limit . op records met dubbele namen, samen met hun _id s. Bijvoorbeeld:

{
  "_id" : {
    "name" : "Toothpick"
},
  "uniqueIds" : [
    "xzuzJd2qatfJCSvkN",
    "9bpewBsKbrGBQexv4",
    "fi3Gscg9M64BQdArv",
  ],
  "count" : 3
},
{
  "_id" : {
    "name" : "Broom"
  },
  "uniqueIds" : [
    "3vwny3YEj2qBsmmhA",
    "gJeWGcuX6Wk69oFYD"
  ],
  "count" : 2
}


  1. Rails, Sidekiq - Redis NOAUTH

  2. Mongoose verloopt eigendom werkt niet goed

  3. De importmodi van mongoimport

  4. MapVerminder schuifelen en sorteren in Hadoop