mongodb 按照時間聚類 java

來源:互聯網
上載者:User

標籤:

當儲存到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<DBObject>參數,所以允許三個操作並列。

下面是一個例子。

 

$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<DBObject> 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}}")

 

mongodb 按照時間聚類 java

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.