java时间聚类_mongodb 按照时间聚类 java
當存儲到mongodb中的是string類型的時間,小tips:
1. 那么在對此域按照時間聚類(每周,每月)時就不能直接使用mongodb的time關鍵字了,因為mongodb有自己的時間類型,且目前它只認可自己的時間類型。
2. 假如對于時間進行簡單的聚類,比如按照年,月,日,時,分,秒來聚類,我們可以使用mongodb的substr關鍵字模擬出mongodb能夠認可的時間類型。
比如 2015-03-02 22:53:45 ---> 2014 這樣截取出year,2014-03-02就是截取出day。
3. 按照季度或者星期來聚類時就有些麻煩了, 這時需要我們先分別按照月,日來進行一步聚類,將聚類后的中間結果在java中完成二次聚類。比如以星期進行聚類時需要先按照day來取,再結合java的calendar來得出星期
db.myObject.aggregate(
{$project:{new_time_stamp:{$substr:["$time_stamp",0,10]}}},
{$group:{_id:"$new_time_stamp","count":{$sum:1}}});
mongodb聚類
mongodb聚類可分為三個子操作,分別是match, project, group
三個子操作均體現為DBObject類型,aggregation接受List參數,所以允許三個操作并列。
下面是一個例子。
$match: {type: "airfare"}, type 是一個域,而airfare是值,這里要求完全匹配。假如match更加復雜,那么可以這么寫
$match: {type: "airfare", date: {$gte: "2015-03-03", $lte: "2015-03-05"}}
注意,match的內容并不是一個array,而是以逗號隔開的對象
$project: {id: {$substr: ["$date", 0, 4]}
pass along all the documents with only the specified field to the next stage of pipeline. 在默認情況下,_id屬性會傳遞到下一階段。可以通過
"_id" : 0 來顯式的刪掉 _id 屬性。
project可以對值進行更名操作以及concat, substr, add, mutiply, mod 操作
$group 最重要的,聚類操作。
group必須有_id屬性,用來標識那些被聚集的屬性。但是_id的值可以為null,用于求和求平均。
在group的時候可以同時對屬性名稱進行修改
$group: {
$_id : {month: {$month: "$date"}, day: {$day: "$date"}},
$totalPrice: {$sum: {$multiply: ["$price", "$quantity"]}},
$averagePrice: {$avg: ["$price"]},
count: {$sum, 1}
}
_id, totalPrice, averagePrice, count 都會分別作為一個屬性返回。
另外的屬性還包括
$sort,?按照某個屬性排序
{$sort: {age: 1, money: -1}}
$skip, $limit 表示越過多少或者僅返回多少條目。
$unwind 將數組的元素拆開。
$out 表示為輸出的結果新建一個collection
{$out: "authors"} ,它必須作為最后pipeline的最后一個stage
一個聚類的例子,完全使用java實現
DBObject fields = new BasicDBObject("url", "$uri")
DBObject project= new BasicDBObject("$project", fields)
DBObject idField= new BasicDBObject("_id", new BasicDBObject("url", "$url"));
idField.put("count", new BasicDBObject("$sum", 1));
DBObject group= new BasicDBObject("$group", idField);
DBObject sort= new BasicDBObject("$sort", new BasicDBObject("count", -1));
List pipeline =Arrays.asList(project, group, sort);
AggregationOutput output=collection.aggregate(pipeline);for(DBObject result: output.results())
System.out.println(result)
上面的代碼中DBObject的組裝相當麻煩且看不出json的架構,因為一個更好的做法是從json轉化
DBObject project = JSON.parse("{$project: {"url": \"$uri\"}}")
DBObject group= JSON.parse("{$group: {_id: {"url":"$url"}}}")
DBObject sort= JSON.parse("{$sort: {count: -1}}")
總結
以上是生活随笔為你收集整理的java时间聚类_mongodb 按照时间聚类 java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内部类详解————局部内部类
- 下一篇: javaweb通过接口来实现多个文件压缩