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

MongoDB select count(distinct x) na indexovaném sloupci – počítání jedinečných výsledků pro velké datové sady

1) Nejjednodušší způsob, jak toho dosáhnout, je prostřednictvím agregačního rámce. To vyžaduje dva příkazy "$group":první seskupuje podle odlišných hodnot, druhý počítá všechny odlišné hodnoty

pipeline = [ 
    { $group: { _id: "$myIndexedNonUniqueField"}  },
    { $group: { _id: 1, count: { $sum: 1 } } }
];

//
// Run the aggregation command
//
R = db.runCommand( 
    {
    "aggregate": "myCollection" , 
    "pipeline": pipeline
    }
);
printjson(R);

2) Pokud to chcete provést pomocí Map/Reduce, můžete. Toto je také dvoufázový proces:v první fázi vytvoříme novou kolekci se seznamem všech odlišných hodnot klíče. Ve druhém provedeme count() na nové kolekci.

var SOURCE = db.myCollection;
var DEST = db.distinct
DEST.drop();


map = function() {
  emit( this.myIndexedNonUniqueField , {count: 1});
}

reduce = function(key, values) {
  var count = 0;

  values.forEach(function(v) {
    count += v['count'];        // count each distinct value for lagniappe
  });

  return {count: count};
};

//
// run map/reduce
//
res = SOURCE.mapReduce( map, reduce, 
    { out: 'distinct', 
     verbose: true
    }
    );

print( "distinct count= " + res.counts.output );
print( "distinct count=", DEST.count() );

Všimněte si, že nemůžete vrátit výsledek mapy/zmenšení inline, protože to potenciálně překročí limit velikosti dokumentu 16 MB. můžete uložte výpočet do kolekce a poté count() velikost kolekce, nebo můžete získat počet výsledků z návratové hodnoty mapReduce().



  1. Nastavení Redis na Webfaction

  2. Jak se připojit k vašim MongoDB nasazením pomocí Robo 3T GUI

  3. Vložený dokument vs reference v designovém modelu mongoose?

  4. Optimalizace výkonu Nodejs