web-dev-qa-db-fra.com

mongodb count nombre de valeurs distinctes par champ / clé

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

f.e j'ai un champ pour pays et il y a 8 types de valeurs de pays (espagne, angleterre, france, etc ...)

Si quelqu'un ajoute plus de documents à un nouveau pays, j'aimerais que la requête renvoie 9.

Y a-t-il moyen plus simple que de grouper et de compter

81
Liatz

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 existe également un shell db.collection.distinct() :

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

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

Voici un exemple d'utilisation de l'API d'agrégation. Pour compliquer la casse, nous regroupons les mots non sensibles à 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 un résultat tel 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 }
89
expert

Avec MongoDb 3.4.4 et plus récent, vous pouvez tirer parti de $arrayToObject opérateur et un $replaceRoot pipeline pour obtenir les comptes.

Par exemple, supposons que vous avez un ensemble d'utilisateurs avec différents rôles et que vous souhaitez calculer les nombres distincts de rôles. Vous devez exécuter le pipeline d'agrégat 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
}
13
chridam

Vous pouvez utiliser Mongo Shell Extensions . C'est une simple importation .js que vous pouvez ajouter à votre $HOME/.mongorc.js, Ou par programmation, si vous codez également dans Node.js/io.js.

Échantillon

Pour chaque valeur distincte de champ, les occurrences dans les documents sont filtrées en option par requête.

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

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

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

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

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

Pour trouver distinct dans field_1 Dans la collection mais nous voulons aussi une condition WHERE que nous ne pouvons faire comme suit:

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

Donc, trouvez le numéro distinct names dans une collection où age> 25 sera comme:

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

J'espère que ça aide!

4
Vimal