为集合中的所有键运行map reduce - mongodb

时间:2016-02-11 09:35:00

标签: mongodb mapreduce

我在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查询,并输出所有这些单输出的结果。有什么方法可以让我按顺序为所有客户做这件事吗?

1 个答案:

答案 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