2016-02-11 32 views
1

我使用映射减少MongoDB中找出订单的数量这样运行图减少对集中的所有键 - MongoDB的

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 } } 
输出的客户

目前它正在为单个客户工作,这是一个关键。现在我想要这个为订单集合中的所有客户运行这个映射reduce查询,并输出所有像这个单一输出的结果。有什么方法可以让我为所有客户做到这一点?

+1

删除“查询”。这是选择一个客户。没有它,这将会减少到每个客户的一个结果。 –

+0

我删除了{query:{customer:ObjectId(“552623e7e4b0cade517f9714”)}, out:“order_total”},现在显示错误错误:断言失败:需要提供optionsOrOutString,我做错了什么? – user29578

+0

是的,我的错误我也删除了部分,非常感谢budddy – user29578

回答

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 } 

注意,具有非常大的集合,这极有可能是不适合的,因为它使需要一段时间(但它仍然应该比地图更快/缩小操作)。

为了找到一个客户的订单数,你可以使用一个简单的查询和使用方法cursor.count()

> db.orders.find({ "customer": "a" }).count() 
3 
+0

尝试同样的事情,但它是给空的结果,可能是什么原因 – user29578

+0

@ user29578请添加一些示例文件,并使用编辑按钮将它们添加到您的问题... –

+0

我删除了这个{“$ out”:“ order_total“},它的工作,不要为什么:) – user29578