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
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
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 }
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
}
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,
...
}
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!