MongoDB WYBIERZ LICZBA GRUPA WG


180

Bawię się MongoDB, próbując wymyślić, jak zrobić proste

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

Ale wydaje mi się, że nie mogę tego rozgryźć za pomocą funkcji agregującej. Mogę to zrobić używając jakiejś naprawdę dziwnej składni grup

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

Ale czy istnieje łatwiejszy / szybszy sposób korzystania z funkcji agregującej?

Odpowiedzi:


326

Byłby to łatwiejszy sposób na zrobienie tego za pomocą aggregate:

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

1
Gdy próbuję, pojawia się komunikat o błędzie "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven

jak to grupujesz? Chcę sortować według -1
Filip Bartuzi

4
@FilipBartuzi jest przykład na stronie dokumentacji, będziesz musiał dodać operację sortowania do potoku, as{ $sort: { count: -1 } }
elaich

Dostałem ten sam wyjątek, co @Steven, a to dlatego, że skopiowałem i wkleiłem tylko wiersz 2 i pominąłem otaczające nawiasy kwadratowe.
Peter Perháč

proszę o pomoc, jeśli możesz, w przypadku podobnych pytań w mongoDB - stackoverflow.com/questions/61067856/ ...
newdeveloper

66

Potrzebuję dodatkowej operacji w oparciu o wynik funkcji agregującej. Wreszcie znalazłem rozwiązanie dla funkcji agregującej i operacji opartej na wyniku w MongoDB. Mam kolekcję Requestz polem request, source, status, requestDate.

Pojedyncze grupowanie według i liczby:

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

Grupowanie wielu pól według i zliczanie:

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

Wiele pól Grupuj według i policz za pomocą opcji Sortuj używając pola:

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

Wiele pól Grupuj według i policz z Sortuj używając licznika:

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

50

Jeśli potrzebujesz wielu kolumn do grupowania, postępuj zgodnie z tym modelem. Tutaj przeprowadzam liczenie przez statusi type:

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

2
_id reprezentuje domyślny parametr do hermetyzacji wielu pól?
Eugen Sunic

18

Dodatkowo, jeśli chcesz ograniczyć grupowanie, możesz użyć:

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

17

Począwszy od MongoDB 3.4, możesz użyć $sortByCountagregacji.

Grupuje dokumenty przychodzące na podstawie wartości określonego wyrażenia, a następnie oblicza liczbę dokumentów w każdej odrębnej grupie.

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

Na przykład:

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

2
Prawdopodobnie warto tutaj zauważyć, że $sortByCountjest to faktycznie „pseudooperator”, jak kilka innych operatorów etapu agregacji wprowadzonych z MongoDB 3.4. Wszystko, co naprawdę robią, to rozszerzanie się na odpowiednie etapy agregacji. W tym przypadku $groupz, $sum: 1jak pokazano w istniejących odpowiedziach i dodatkowym $sort etapie. Nie oferują żadnej korzyści poza „wpisywaniem mniejszej ilości kodu” , co może, ale nie musi być bardziej opisowe (jeśli lubisz takie rzeczy). IMHO, odrębne $groupi $sortetapy w kodzie są znacznie bardziej opisowe i rzeczywiście bardziej elastyczne.
Neil Lunn


0

Polecenie powłoki Mongo, które działało dla mnie:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.