web-dev-qa-db-fra.com

Mongo compte les occurrences de chaque valeur pour un ensemble de documents

J'ai des documents comme celui-ci:

{
  "user": '1'
},
{ "user": '1'
},
{
  "user": '2'
},
{
  "user": '3'
}

J'aimerais pouvoir obtenir un ensemble de tous les différents utilisateurs et leurs comptes respectifs, triés par ordre décroissant. Donc, ma sortie serait quelque chose comme ça:

{
  '1': 2,
  '2': 1,
  '3': 1
}

Je pense que cela peut être fait avec un agrégat Mongo (), mais j'ai beaucoup de difficulté à trouver le bon flux pour cela.

29
ritmatter

Vous pouvez obtenir un résultat (pas dans le format requis) via agrégation

db.collection.aggregate(
   {$group : { _id : '$user', count : {$sum : 1}}}
).result

la sortie de vos exemples de documents est la suivante:

"0" : {
    "_id" : "2",
    "count" : 1
},
"1" : {
    "_id" : "3",
    "count" : 1
},
"2" : {
    "_id" : "1",
    "count" : 2
}
44
Disposer

Pour ceux qui liront ceci en janvier 2019, la réponse acceptée ne fonctionne pas actuellement dans Robo3T (renvoie une erreur pipeline.length - 1).

Vous devez:

a) envelopper la requête dans un jeu de crochets [] 

b) retirez .result de la fin

https://github.com/Studio3T/robomongo/issues/1519#issuecomment-441348191

Voici une mise à jour de la réponse acceptée par @disposer qui fonctionne pour moi dans Robo3T.

db.getCollection('collectionName').aggregate(
    [ {$group : { _id : '$user', count : {$sum : 1}}} ]
)
1
Ruben Murray