MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB select count(distinct x) sur une colonne indexée - compte les résultats uniques pour les grands ensembles de données

1) Le moyen le plus simple de procéder consiste à utiliser le cadre d'agrégation. Cela prend deux commandes "$group":la première groupe par valeurs distinctes, la seconde compte toutes les valeurs distinctes

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

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

2) Si vous voulez le faire avec Map/Reduce, vous pouvez. Il s'agit également d'un processus en deux phases :dans la première phase, nous construisons une nouvelle collection avec une liste de chaque valeur distincte pour la clé. Dans la seconde on fait un count() sur la nouvelle collection.

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

Notez que vous ne pouvez pas renvoyer le résultat du mappage/réduction en ligne, car cela risquerait de dépasser la limite de taille de document de 16 Mo. Vous pouvez enregistrez le calcul dans une collection, puis count() la taille de la collection, ou vous pouvez obtenir le nombre de résultats à partir de la valeur de retour de mapReduce().