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

MongoDB select count(distinct x) in einer indizierten Spalte – zählt eindeutige Ergebnisse für große Datensätze

1) Am einfachsten geht das über das Aggregation Framework. Dies erfordert zwei "$group"-Befehle:Der erste gruppiert nach unterschiedlichen Werten, der zweite zählt alle unterschiedlichen Werte

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

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

2) Wenn Sie dies mit Map/Reduce tun möchten, können Sie dies tun. Dies ist auch ein zweiphasiger Prozess:In der ersten Phase erstellen wir eine neue Sammlung mit einer Liste aller eindeutigen Werte für den Schlüssel. Im zweiten führen wir einen count() für die neue Sammlung durch.

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() );

Beachten Sie, dass Sie das Ergebnis der Map/Reduce-Inline nicht zurückgeben können, da dies möglicherweise die Dokumentgröße von 16 MB überschreitet. Sie können Speichern Sie die Berechnung in einer Sammlung und zählen Sie dann die Größe der Sammlung, oder Sie können die Anzahl der Ergebnisse aus dem Rückgabewert von mapReduce() erhalten.