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?
"errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",
?{ $sort: { count: -1 } }
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ę
Request
z polemrequest, source, status, requestDate
.Pojedyncze grupowanie według i liczby:
Grupowanie wielu pól według i zliczanie:
Wiele pól Grupuj według i policz za pomocą opcji Sortuj używając pola:
Wiele pól Grupuj według i policz z Sortuj używając licznika:
źródło
Jeśli potrzebujesz wielu kolumn do grupowania, postępuj zgodnie z tym modelem. Tutaj przeprowadzam liczenie przez
status
itype
:źródło
Dodatkowo, jeśli chcesz ograniczyć grupowanie, możesz użyć:
źródło
Począwszy od MongoDB 3.4, możesz użyć
$sortByCount
agregacji.https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/
Na przykład:
źródło
$sortByCount
jest 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$group
z,$sum: 1
jak 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$group
i$sort
etapy w kodzie są znacznie bardziej opisowe i rzeczywiście bardziej elastyczne.Ten typ zapytania zadziałał dla mnie:
Zobacz http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/
źródło
Polecenie powłoki Mongo, które działało dla mnie:
źródło