2015-04-20 164 views
1

說我有一個包含以下信息的MongoDB的集合:MongoDB的彙總查詢集團通過

{ 
    cust_id: "abc123", 
    ord_date: ISODate("2012-11-02T17:04:11.102Z"), 
    state: 'CA', 
    price: 50, 
    item: apple, 
    color: red 
} 
{ 
    cust_id: "abc123", 
    ord_date: ISODate("2012-11-02T17:04:11.102Z"), 
    state: 'WA', 
    price: 25, 
    item: apple, 
    color: green 
} 
{ 
    cust_id: "abc123", 
    ord_date: ISODate("2012-11-02T17:04:11.102Z"), 
    state: 'CA', 
    price: 75, 
    item: orange, 
    color: orange 
} 
{ 
    cust_id: "def456", 
    ord_date: ISODate("2012-11-02T17:04:11.102Z"), 
    state: 'OR', 
    price: 75, 
    item: apple, 
    color: red 
} 

我想要做的狀態,其中該項目是「蘋果」分組訂單的總價格的總金額顏色是'紅'。我詢問,我有是:

{ 
    $match: {$and: [{item : "apple"}, {color : "red"}]}, 
    $group: {_id: {state: "$state", cust_id: "$cust_id"}, total: {$sum: "$price"}} 
} 

不過,我想有我得到的是一個數組/地圖/部分包含所有客戶ID包含我的總的列表結構的能力CUST_ID包含在_id總。因此,我想我的輸出包含

cust_id {'abc123', 'def456'} 

有沒有辦法處理這個mongo聚合/查詢?或者,也許更好的方法來構造這個查詢,這樣我就可以將紅蘋果的成本計算在內,並按照國家進行分組,幷包括屬於這一類的所有客戶?爲了提取信息,我把它放在_id部分,但是這些數據都不是很重要。我只想按照國家的方式進行分組,並獲得具有上述彙總選擇的所有客戶ID的集合。

回答

2

是的,在你的聚集$group管道可以使用$addToSet集成算到cust_id s添加到一個數組,而你仍然可以按狀態:

db.collection.aggregate([ 
    { 
     "$match": { 
      "item": "apple", 
      "color" : "red" 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$state", 
      "cust_id": { 
       "$addToSet": "$cust_id" 
      }, 
      "total": { 
       "$sum": "$price" 
      } 
     } 
    } 
]); 

輸出

/* 1 */ 
{ 
    "result" : [ 
     { 
      "_id" : "OR", 
      "cust_id" : [ 
       "def456" 
      ], 
      "total" : 75 
     }, 
     { 
      "_id" : "CA", 
      "cust_id" : [ 
       "abc123" 
      ], 
      "total" : 50 
     } 
    ], 
    "ok" : 1 
} 
+1

謝謝!正是我需要的! – fowlball1010

+0

@ fowlball1010不用擔心:-) – chridam