2016-02-11 38 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