Jak můžete vidět z dotazu, který jste napsali, tento typ agregace ve verzi 2.0 vyžaduje spuštění Map/Reduce. Map/Reduce na MongoDB má některé výkonové sankce, které byly pokryty na SO dříve - v zásadě, pokud nejste schopni paralelizovat přes cluster, budete spouštět jednovláknový javascript přes Spidermonkey - není to rychlý návrh. Index, protože nejste selektivní, ve skutečnosti nepomůže – stačí naskenovat celý rejstřík a případně i dokument.
S blížícím se vydáním 2.2 (aktuálně v rc1 v době psaní tohoto článku) však máte nějaké možnosti. rámec agregace (který je nativní, nikoli Map/Reduce založený na JS) představený ve verzi 2.2 má vestavěný skupinový operátor a byl vytvořen speciálně pro urychlení tohoto druhu operací v MongoDB.
Doporučil bych vyzkoušet 2.2 a zjistit, zda se váš výkon při seskupování zlepší. Myslím, že by to vypadalo nějak takto (poznámka:netestováno):
db.alarm.aggregate(
{ $group : {
_id : "$serverName",
count : { $sum : 1 }
}}
);