MongoDB SELEZIONA COUNT GROUP BY


181

Sto giocando con MongoDB cercando di capire come fare un semplice

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

Ma non riesco a capirlo usando la funzione aggregata. Posso farlo usando una sintassi di gruppo davvero strana

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

Ma c'è un modo più semplice / veloce usando la funzione aggregata?

Risposte:


327

Questo sarebbe il modo più semplice per farlo utilizzando aggregate:

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

1
Viene visualizzato un messaggio di errore quando lo provo "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven,

come si raggruppa in questo modo? Voglio ordinare il conteggio per -1
Filip Bartuzi il

4
@FilipBartuzi c'è un esempio nella pagina della documentazione, dovrai aggiungere un'operazione di ordinamento alla pipeline, come{ $sort: { count: -1 } }
elaich

Ho avuto la stessa eccezione di @Steven ed è stato perché ho incollato solo la riga 2 e omesso le parentesi quadre circostanti.
Peter Perháč,

pls aiuto se è possibile per questioni connesse a MongoDB - stackoverflow.com/questions/61067856/...
newdeveloper

66

Ho bisogno di qualche operazione extra in base al risultato della funzione aggregata. Finalmente ho trovato una soluzione per la funzione aggregata e l'operazione basata sul risultato in MongoDB. Ho una collezione Requestcon campo request, source, status, requestDate.

Gruppo singolo campo e numero:

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

Raggruppa e conta più campi:

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

Più campi Raggruppa e conta con Ordina utilizzando campo:

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

Più campi Raggruppa e conta con Ordina utilizzando Conteggio:

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

50

Se hai bisogno di più colonne per raggruppare, segui questo modello. Qui sto conducendo un conteggio di statuse type:

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

2
_id rappresenta un parametro predefinito per l'incapsulamento di più campi?
Eugen Sunic,

18

Inoltre, se è necessario limitare il raggruppamento, è possibile utilizzare:

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

17

A partire da MongoDB 3.4, è possibile utilizzare l' $sortByCountaggregazione.

Raggruppa i documenti in arrivo in base al valore di un'espressione specificata, quindi calcola il conteggio dei documenti in ciascun gruppo distinto.

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

Per esempio:

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

2
Probabilmente vale la pena notare che in $sortByCountrealtà è un "pseudo operatore" come molti altri operatori in fase di aggregazione introdotti da MongoDB 3.4. Tutto quello che fanno è espandersi nelle rispettive fasi di aggregazione. In questo caso un $groupcon $sum: 1come mostrato nelle risposte esistenti e una $sort fase aggiuntiva . Non offrono alcun vantaggio se non quello di "digitare meno codice" , che può o meno essere più descrittivo (se ti piace quel genere di cose). IMHO, distinti $groupe $sortfasi del codice sono molto più descrittivi e anzi più flessibili.
Neil Lunn,


0

Comando shell Mongo che ha funzionato per me:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.