MongoDB SELECIONE O GRUPO DE CONTAGEM POR


179

Estou brincando com o MongoDB tentando descobrir como fazer uma simples

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

Mas parece que não consigo descobrir isso usando a função agregada. Eu posso fazer isso usando uma sintaxe de grupo muito estranha

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

Mas existe uma maneira mais fácil / rápida de usar a função agregada?

Respostas:


326

Essa seria a maneira mais fácil de fazer isso usando aggregate:

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

1
Recebo uma mensagem de erro quando tento isso "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven

como você agrupa a ordem? Quero ordenar a contagem por -1 #
Filip Bartuzi 26/06

4
@FilipBartuzi há um exemplo na página de documentação, você terá que adicionar uma operação de classificação para o gasoduto, como{ $sort: { count: -1 } }
elaich

Eu recebi a mesma exceção do @Steven e foi porque copiei a linha 2 e omiti os colchetes circundantes.
Peter Perháč

pls ajuda se você puder para perguntas relacionadas no mongoDB - stackoverflow.com/questions/61067856/…
newdeveloper

66

Eu preciso de alguma operação extra com base no resultado da função agregada. Finalmente, encontrei uma solução para a função agregada e a operação com base no resultado no MongoDB. Eu tenho uma coleção Requestcom campo request, source, status, requestDate.

Grupo de campo único por & contagem:

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

Vários campos agrupados por & contagem:

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

Vários campos Agrupar por e contar com classificação usando o campo:

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

Vários campos Agrupar por e contar com classificação usando Contagem:

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

50

Se você precisar de várias colunas para agrupar, siga este modelo. Aqui estou conduzindo uma contagem por statuse type:

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

2
_id representa um parâmetro padrão para encapsular vários campos?
Eugen Sunic

18

Além disso, se você precisar restringir o agrupamento, poderá usar:

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

17

A partir do MongoDB 3.4, você pode usar a $sortByCountagregação.

Agrupa documentos recebidos com base no valor de uma expressão especificada e calcula a contagem de documentos em cada grupo distinto.

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

Por exemplo:

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

2
Provavelmente vale a pena notar aqui que $sortByCountna verdade é um "pseudo operador", como vários outros operadores de estágio de agregação introduzidos no MongoDB 3.4. Tudo o que eles realmente fazem é expandir para seus respectivos estágios de agregação. Nesse caso, a $groupcom $sum: 1é mostrado nas respostas existentes e um $sort estágio adicional . Eles não oferecem outra vantagem além de "digitar menos código" , que pode ou não ser mais descritivo (se você gosta desse tipo de coisa). IMHO, distintos $groupe $sortestágios no código são muito mais descritivos e, de fato, mais flexíveis.
Neil Lunn


0

Comando shell Mongo que funcionou para mim:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.