web-dev-qa-db-fra.com

MongoDB SELECT COUNT GROUP BY

Je joue avec MongoDB en essayant de comprendre comment faire un simple

SELECT province, COUNT(*) FROM contest GROUP BY province

Mais je n'arrive pas à comprendre en utilisant la fonction d'agrégat. Je peux le faire en utilisant une syntaxe de groupe vraiment bizarre

db.user.group({
    "key": {
        "province": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    }
});

Mais existe-t-il un moyen plus simple et plus rapide d’utiliser la fonction d’agrégation?

114
Steven

Ce serait le moyen le plus simple de le faire en utilisant aggregate :

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])
227
Anand Jayabalan

Si vous devez regrouper plusieurs colonnes, suivez ce modèle. Ici, je compte par status et type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })
37
KitkatJohn

J'ai besoin d'une opération supplémentaire basée sur le résultat de la fonction d'agrégation. Enfin, j'ai trouvé une solution pour la fonction d'agrégat et l'opération basée sur le résultat dans MongoDB. J'ai une collection Request avec le champ request, source, status, requestDate.

Groupe de champs unique par et nombre:

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

Plusieurs champs groupés par & nombre:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])

Groupe de champs multiples par et nombre avec tri à l'aide du champ:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"_id.source":1}}
])

Plusieurs champs groupés par et comptés avec un tri utilisant comte:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])
34
csharpbd

De plus, si vous devez restreindre le regroupement, vous pouvez utiliser:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)
10
andre

Ce type de requête a fonctionné pour moi:

 db.events.aggregate({$group: {_id : "$date", number:  { $sum : 1} }} )

Voir http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/

6
prule

À partir de MongoDB 3.4, vous pouvez utiliser l'agrégation $sortByCount.

Regroupe les documents entrants en fonction de la valeur d'une expression spécifiée, puis calcule le nombre de documents dans chaque groupe distinct.

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

Par exemple:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);
0
MattM