mongodb compte num de valeurs distinctes par champ / clé

Existe-t-il une requête pour calculer combien de valeurs distinctes un champ contient dans la firebase database.

fe j’ai un champ pour le pays et il y a 8 types de valeurs pays (espagne, angleterre, france, etc …)

Si quelqu’un ajoute plus de documents à un nouveau pays, j’aimerais que la requête soit renvoyée 9.

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

MongoDB a une commande distinct qui renvoie un tableau de valeurs distinctes pour un champ; vous pouvez vérifier la longueur du tableau pour un compte.

Il y a aussi une db.collection.distinct() shell shell db.collection.distinct() :

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

Voici un exemple d’utilisation de l’API d’agrégation. Pour compliquer le cas, nous regroupons par mots insensibles à la casse la propriété tableau 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 } 

Vous pouvez tirer parti des extensions Mongo Shell . C’est une seule importation .js que vous pouvez append à votre $HOME/.mongorc.js , ou par programmation si vous codez dans Node.js / io.js également.

Échantillon

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

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

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

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

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

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

Avec MongoDb 3.4.4 et versions ultérieures, vous pouvez utiliser l’opérateur $arrayToObject et un pipeline $replaceRoot pour obtenir les résultats.

Par exemple, supposons que vous disposiez d’une collection d’utilisateurs avec des rôles différents et que vous souhaitiez calculer les comptes distincts des rôles. Vous devez exécuter le pipeline agrégé suivant:

 db.users.aggregate([ { "$group": { "_id": { "$toLower": "$role" }, "count": { "$sum": 1 } } }, { "$group": { "_id": null, "counts": { "$push": { "k": "$_id", "v": "$count" } } } }, { "$replaceRoot": { "newRoot": { "$arrayToObject": "$counts" } } } ]) 

Exemple de sortie

 { "user" : 67, "superuser" : 5, "admin" : 4, "moderator" : 12 } 

Pour trouver distinct dans field_1 dans la collection mais nous voulons une condition WHERE aussi 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 de names distincts d’une collection où âge> 25 sera comme:

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

J’espère que cela aide!