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<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", ));
DBObject group = new BasicDBObject("$group", idField);
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("count", -));
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的更多相关文章
- Data Base MongoDB 插入时间不正确的问题
关于mongodb插入时间不正确的问题 mongodb插入时间: 把本地时间转换为utc时间: 也就是比本地时间少8个小时: 读取的时候又会转换本地时间: 所有一般不需处理:
- Mongodb入门并使用java操作Mongodb
转载请注意出处:http://blog.csdn.net/zcm101 最近在学习NoSql,先从Mongodb入手,把最近学习的总结下. Mongodb下载安装 Mongodb的下载安装就不详细说了 ...
- 【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】
要求:centOS7上部署的mysql和spring boot服务,要求,mysql的时间.java程序服务的时间和宿主机的时间完全保持一致: ============================ ...
- MongoDB插入时间不正确的问题
关于mongodb插入时间不正确的问题 今天在给mongodb插入日期格式的数据时发现,日期时间相差8个小时,原来存储在mongodb中的时间是标准时间UTC +0:00,而中国的时区是+8.00 . ...
- mongodb数据库连接池(java版)
mongodb数据库接口的设计 package storm.db; import java.util.ArrayList; import com.mongodb.DB; import com.mong ...
- MongoDB(3)--Java 操作 MongoDB 的 API
引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...
- Mongodb 笔记 - 性能及Java代码
性能 以下数据都是在千兆网络下测试的结果 写入 数据量的增大会导致内存占满, 因为mongodb会将数据尽可能地载入内存, 索引占用的空间也很可观非安全模式下, 速度取决于内存是否占满能差一个数量级, ...
- 【日期-时间】Java中Calendar的使用
主要介绍了Calendar类的使用 输出 * 时间格式化 * 当前时间:2016-12-02 16:46:27.079 * * 转换:String-->Date-->Calendar * ...
- MONGODB(三)——Java操作Mongo
相比于java调用MySqlApI来操作数据库,调用Mongo要简洁容易的多.通过一个简单的样例,很容易地就可以上手 一.导入Jar包 添加Monog支持Java的jar包,这里使用的是2.9.3 & ...
随机推荐
- Nexus 7更换NFC控制器,导致不再支持读取Mifare Classic NFC 1k Tags
In a review conducted by Anandtech, it was found that the Nexus 4 makes use of the Broadcom BCM20793 ...
- 【oneday_onepage】——Ten Changes To Make A Difference In Your Life
When you want to change something in your life, it can feel overwhelming. Whether it’s losing 50lbs ...
- 1 php protocolbuffers安装
安装工具 yum install autoconf yum install libtool 安装protoc编译器 # cd /root/soft/protobuf- autogen.sh : if ...
- Spring MVC异常处理SimpleMappingExceptionResolver
Spring MVC异常处理SimpleMappingExceptionResolver[转] (2012-12-07 13:45:33) 转载▼ 标签: 杂谈 分类: 技术分享 Spring3.0中 ...
- Ubuntu 16.04 标题栏实时显示上下行网速、CPU及内存使用率
有时感觉网络失去响应,就通过Ubuntu 14.04自带的系统监视器程序来查看当前网速,但是这样很不方便,遂打算让网速显示在标题栏,那样就随时可直观的看到.一番搜索尝试后,成功实现!同时也实现了CPU ...
- Linux高级字符设备驱动 poll方法(select多路监控原理与实现)
1.什么是Poll方法,功能是什么? 2.Select系统调用(功能) Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程. int selec ...
- 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页
第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...
- 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)
转至 (http://blog.csdn.net/yanzi1225627/article/details/17652643) 经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下. ...
- Ubuntu+Eclipse+SVN 版本控制配置笔记
第一步:先更新系统内部软件包缓存(预防出错) # sudo dpkg --clear-avail # sudo apt-get update 第二步:安装Eclipse的SVN接口组件“javaH ...
- Eclipse和MyEclipse的区别 分类: 编程工具 2015-07-18 11:12 23人阅读 评论(0) 收藏
今天,在一个Q群里有人问Eclipse和MyEclipse的区别.虽然对于知道的人来说答案很简单,但是对于不知道的人来说就很难,很多问题也都是这样的,会者不难,难者不会. 其实,网上搜搜答案就挺多的, ...