接上一篇... 見:
為了方便我還是把我的表結構貼上來:
和資料庫一樣group常常用於統計。MongoDB的group還有很多限制,如:返回結果集不能超過16M, group操作不會處理超過10000個唯一鍵,好像還不能利用索引[不很確定]。
Group大約需要一下幾個參數。
- key:用來分組文檔的欄位。和keyf兩者必須有一個
- keyf:可以接受一個javascript函數。用來動態確定分組文檔的欄位。和key兩者必須有一個
- initial:reduce中使用變數的初始化
- reduce:執行的reduce函數。函數需要傳回值。
- cond:執行過濾的條件。
- finallize:在reduce執行完成,結果集返回之前對結果集最終執行的函數。可選的
下面我用Java對他們做一些測試。
我們以age年齡統計集合中存在的使用者。Spring Schema和上次的一樣。有了MongoTemplate對象我們可以做所有事的。以age統計使用者測試代碼如:
@Test
public void testGroupBy() throws Exception {
String reduce = "function(doc, aggr){" +
" aggr.count += 1;" +
" }";
Query query = Query.query(Criteria.where("age").exists(true));
DBObject result = mongoTemplate.getCollection("person").group(new BasicDBObject("age", 1),
query.getQueryObject(),
new BasicDBObject("count", 0),
reduce);
Map map = result.toMap();
System.out.println(map);
for (Map.Entry o : map.entrySet()) {
System.out.println(o.getKey() + " " + o.getValue());
}
}
key為new BasicDBObject("age", 1)
cond為:Criteria.where("age").exists(true)。即使用者中存在age欄位的。
initial為:new BasicDBObject("count", 0),即初始化reduce中人的個數為count為0。假如我們想在查詢的時候給每個年齡的人增加10個假使用者。我們只需要傳入BasicDBObject("count", 10).
reduce為:reduce的javascript函數
上面的執行輸出如:
2 [age:23.0, count:1.0]
1 [age:25.0, count:1.0]
0 [age:24.0, count:1.0]
前面的是一個序號,是Mongo的java-driver加上去的。我們可以看到結果在後面。