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?
Ce serait le moyen le plus simple de le faire en utilisant aggregate
:
db.contest.aggregate([
{"$group" : {_id:"$province", count:{$sum:1}}}
])
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
}
}
})
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}}
])
De plus, si vous devez restreindre le regroupement, vous pouvez utiliser:
db.events.aggregate(
{$match: {province: "ON"}},
{$group: {_id: "$date", number: {$sum: 1}}}
)
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/
À 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" }
]);