我在mongodb中使用map reduce来查找像这样的客户的订单数量
db.order.mapReduce(
function() {
emit (this.customer,{count:1})
},
function(key,values){
var sum =0 ;
values.forEach(
function(value) {
sum+=value['count'];
}
);
return {count:sum};
},
{
query:{customer:ObjectId("552623e7e4b0cade517f9714")},
out:"order_total"
}).find()
这给了我这样的输出
{ "_id" : ObjectId("552623e7e4b0cade517f9714"), "value" : { "count" : 13 } }
目前,它正在为单个客户工作,这是一个关键。现在我想要在订单收集中为所有客户运行此map reduce查询,并输出所有这些单输出的结果。有什么方法可以让我按顺序为所有客户做这件事吗?
答案 0 :(得分:2)
对于这个简单的任务使用map / reduce有点像使用(相对较慢的)大锤来破解坚果。 aggregation framework基本上是为这种简单的聚合而发明的(并且可以为你做更多的事情!):
db.order.aggregate([
{ "$group":{ "_id":"$customer", "orders":{ "$sum": 1 }}},
{ "$out": "order_total"}
])
根据您的使用情况,您甚至可以省略$out
阶段并直接使用结果。
> db.orders.aggregate([{ "$group":{ "_id":"$customer", "orders":{ "$sum": 1 }}}])
{ "_id" : "b", "orders" : 2 }
{ "_id" : "a", "orders" : 3 }
请注意,对于非常大的集合,这很可能不合适,因为它需要一段时间(但它仍然应该比map / reduce操作更快)。
要查找单个客户的订单数量,您可以使用简单查询并使用cursor.count()方法:
> db.orders.find({ "customer": "a" }).count()
3