150 votes

mongodb count num of distinct values per field/key

Existe-t-il une requête permettant de calculer le nombre de valeurs distinctes qu'un champ contient dans la base de données ?

Par exemple, j'ai un champ pour le pays et il y a 8 types de valeurs de pays (Espagne, Angleterre, France, etc...).

Si quelqu'un ajoute d'autres documents avec un nouveau pays, je voudrais que la requête renvoie 9.

Y a-t-il un moyen plus simple que de regrouper et de compter ?

268voto

Stennie Points 19196

MongoDB dispose d'un distinct commande qui renvoie un tableau de valeurs distinctes pour un champ ; vous pouvez vérifier la longueur du tableau pour obtenir un compte.

Il y a une coquille db.collection.distinct() aide également :

> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]

> db.countries.distinct('country').length
4

Comme indiqué dans la documentation de MongoDB :

Les résultats ne doivent pas être plus grands que la taille maximale du BSON (16MB). Si vos résultats dépassent la taille maximale du BSON, utilisez le pipeline d'agrégation pour récupérer des valeurs distinctes à l'aide de la commande $group comme décrit dans Récupérer des valeurs distinctes avec le pipeline d'agrégation .

155voto

ruslan Points 5754

Voici un exemple d'utilisation de l'API d'agrégation. Pour compliquer le cas, nous regroupons les mots insensibles à la casse à partir de la propriété array du document.

db.articles.aggregate([
    {
        $match: {
            keywords: { $not: {$size: 0} }
        }
    },
    { $unwind: "$keywords" },
    {
        $group: {
            _id: {$toLower: '$keywords'},
            count: { $sum: 1 }
        }
    },
    {
        $match: {
            count: { $gte: 2 }
        }
    },
    { $sort : { count : -1} },
    { $limit : 100 }
]);

qui donnent des résultats tels que

{ "_id" : "inflammation", "count" : 765 }
{ "_id" : "obesity", "count" : 641 }
{ "_id" : "epidemiology", "count" : 617 }
{ "_id" : "cancer", "count" : 604 }
{ "_id" : "breast cancer", "count" : 596 }
{ "_id" : "apoptosis", "count" : 570 }
{ "_id" : "children", "count" : 487 }
{ "_id" : "depression", "count" : 474 }
{ "_id" : "hiv", "count" : 468 }
{ "_id" : "prognosis", "count" : 428 }

11voto

Michael G. Points 33

Je voulais une réponse plus concise et j'ai trouvé ce qui suit en utilisant la documentation à l'adresse suivante agrégats et groupements

db.countries.aggregate([{"$group": {"_id": "$country", "count":{"$sum": 1}}}])

10voto

evandrix Points 1927

Vous pouvez vous appuyer sur Extensions du shell Mongo . Il s'agit d'un simple import .js que vous pouvez ajouter à votre fichier d'installation. $HOME/.mongorc.js ou de manière programmatique, si vous codez également en Node.js/io.js.

Echantillon

Pour chaque valeur distincte du champ, on compte les occurrences dans les documents éventuellement filtrés par la requête.

> db.users.distinctAndCount('name', {name: /^a/i})

{
  "Abagail": 1,
  "Abbey": 3,
  "Abbie": 1,
  ...
}

Le paramètre champ peut être un tableau de champs

> db.users.distinctAndCount(['name','job'], {name: /^a/i})

{
  "Austin,Educator" : 1,
  "Aurelia,Educator" : 1,
  "Augustine,Carpenter" : 1,
  ...
}

8voto

Vimal Points 195

Pour trouver distinct dans field_1 dans la collection mais nous voulons des WHERE que nous pouvons faire comme suit :

db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})

Donc, trouver le nombre distinct names d'une collection où l'âge > 25 ans sera comme :

db.your_collection_name.distinct('names', {'age': {"$gt": 25}})

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X