Usar um map/reduce para essa tarefa simples é como usar uma marreta (comparativamente lenta) para quebrar uma noz. A estrutura de agregação foi basicamente inventado para esse tipo de agregação simples (e pode fazer muito mais por você!):
db.order.aggregate([
{ "$group":{ "_id":"$customer", "orders":{ "$sum": 1 }}},
{ "$out": "order_total"}
])
Dependendo do seu caso de uso, você pode até mesmo omitir o
$out
encenar e consumir os resultados diretamente. > db.orders.aggregate([{ "$group":{ "_id":"$customer", "orders":{ "$sum": 1 }}}])
{ "_id" : "b", "orders" : 2 }
{ "_id" : "a", "orders" : 3 }
Observe que, com coleções muito grandes, isso provavelmente não é adequado, pois demora um pouco (mas ainda deve ser mais rápido que uma operação de map/reduce).
Para encontrar o número de pedidos de um único cliente, você pode usar uma consulta simples e usar o cursor.count() método:
> db.orders.find({ "customer": "a" }).count()
3