博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongodb 按照时间聚类 java
阅读量:5155 次
发布时间:2019-06-13

本文共 2438 字,大约阅读时间需要 8 分钟。

当存储到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
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}}")

 

转载于:https://www.cnblogs.com/xinsheng/p/4309990.html

你可能感兴趣的文章
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
淡定,啊。数据唯一性
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
js编码
查看>>
Pycharm Error loading package list:Status: 403错误解决方法
查看>>
steps/train_sat.sh
查看>>
转:Linux设备树(Device Tree)机制
查看>>
iOS 组件化
查看>>
(转)Tomcat 8 安装和配置、优化
查看>>
(转)Linxu磁盘体系知识介绍及磁盘介绍
查看>>
tkinter布局
查看>>