Obecnie istnieją pewne ograniczenia dotyczące tego, co może zrobić struktura agregacji, aby poprawić wydajność zapytania, ale możesz pomóc w następujący sposób:
db.my_collection.aggregate([
{ "$sort" : { "LOG_TYPE" : 1 } },
{ "$group" :{
"_id": "$LOG_TYPE",
"COUNT": { "$sum":1 }
}}
])
Dodając sortowanie na LOG_TYPE "zmusisz" optymalizator do użycia indeksu na LOG_TYPE w celu uporządkowania dokumentów. Poprawi to wydajność na kilka sposobów, ale różnie w zależności od używanej wersji.
W przypadku danych rzeczywistych, jeśli posortujesz dane przychodzące do etapu $group, poprawi to wydajność akumulacji sum. Możesz zobaczyć różne plany zapytań, w których z $sort użyje indeksu klucza fragmentu. Poprawa rzeczywistej wydajności, jaką daje to, będzie zależeć od liczby wartości w każdym „zasobniku” - ogólnie LOG_TYPE mający tylko siedem odrębnych wartości czyni go wyjątkowo słabym kluczem fragmentu, ale oznacza to, że z dużym prawdopodobieństwem następujący kod będzie dużo szybciej niż nawet zoptymalizowana agregacja:
db.my_collection.distinct("LOG_TYPE").forEach(function(lt) {
print(db.my_collection.count({"LOG_TYPE":lt});
});