MongoDB SELECCIONE EL CONTEO GRUPO POR

181

Estoy jugando con MongoDB tratando de descubrir cómo hacer un simple

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

Pero parece que no puedo entenderlo usando la función de agregado. Puedo hacerlo usando una sintaxis grupal realmente extraña

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++;
    }
});

¿Pero hay una manera más fácil / rápida de usar la función de agregado?

Steven
fuente

Respuestas:

327

Esta sería la forma más fácil de hacerlo usando aggregate:

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])
Anand Jayabalan
fuente
1
¿Recibo un mensaje de error cuando lo intento "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven
¿Cómo se agrupan? Quiero ordenar el conteo por -1
Filip Bartuzi
44
@FilipBartuzi hay un ejemplo en la página de documentación, tendrá que agregar una operación de clasificación a la tubería, como{ $sort: { count: -1 } }
elaich
Obtuve la misma excepción que @Steven y fue porque copié y pegué solo la línea 2 y omití los corchetes circundantes.
Peter Perháč
pls ayuda si puede para preguntas relacionadas en mongoDB - stackoverflow.com/questions/61067856/…
newdeveloper
66

Necesito una operación adicional basada en el resultado de la función agregada. Finalmente encontré alguna solución para la función agregada y la operación basada en el resultado en MongoDB. Tengo una colección Requestcon campo request, source, status, requestDate.

Grupo de campo único por y cuenta:

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

Múltiples campos Agrupar por y contar:

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

Múltiples campos Agrupar por y contar con Ordenar usando campo:

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

Múltiples campos Agrupar por y contar con Ordenar usando la cuenta:

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

Si necesita varias columnas para agrupar, siga este modelo. Aquí estoy realizando un conteo por statusy type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })
KitkatJohn
fuente
2
_id representa un parámetro predeterminado para encapsular múltiples campos?
Eugen Sunic
18

Además, si necesita restringir la agrupación, puede usar:

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

A partir de MongoDB 3.4, puede usar la $sortByCountagregación.

Agrupa los documentos entrantes en función del valor de una expresión especificada, luego calcula el recuento de documentos en cada grupo distinto.

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

Por ejemplo:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);
MattM
fuente
2
Probablemente vale la pena señalar aquí que en $sortByCountrealidad es un "pseudo operador" como varios operadores de etapa de agregación más introducidos desde MongoDB 3.4. Todo lo que realmente hacen es expandirse a sus respectivas etapas de agregación. En este caso, una $groupcon $sum: 1como se muestra en las respuestas existentes y un adicional de $sort fase. No ofrecen otra ventaja que "escribir menos código" , que puede o no ser más descriptivo (si te gusta ese tipo de cosas). En mi humilde opinión, distintas $groupy $sortetapas en el código son mucho más descriptivas y de hecho más flexibles.
Neil Lunn
0

Comando de shell Mongo que funcionó para mí:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Riha
fuente