sql >> Databáze >  >> NoSQL >> MongoDB

Najděte všechny duplicitní dokumenty v kolekci MongoDB podle klíčového pole

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
}


  1. Pruh:Musí poskytnout zdroj nebo zákazníka

  2. Odkazování na jiné dokumenty pomocí řetězce spíše než ObjectId

  3. Jaký je správný způsob, jak vytvořit synchronní dotaz MongoDB v Node.js?

  4. mongodb zkontrolujte, zda je bod v mnohoúhelníku