当存储到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的更多相关文章

  1. Data Base MongoDB 插入时间不正确的问题

    关于mongodb插入时间不正确的问题 mongodb插入时间: 把本地时间转换为utc时间:  也就是比本地时间少8个小时: 读取的时候又会转换本地时间: 所有一般不需处理:

  2. Mongodb入门并使用java操作Mongodb

    转载请注意出处:http://blog.csdn.net/zcm101 最近在学习NoSql,先从Mongodb入手,把最近学习的总结下. Mongodb下载安装 Mongodb的下载安装就不详细说了 ...

  3. 【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】

    要求:centOS7上部署的mysql和spring boot服务,要求,mysql的时间.java程序服务的时间和宿主机的时间完全保持一致: ============================ ...

  4. MongoDB插入时间不正确的问题

    关于mongodb插入时间不正确的问题 今天在给mongodb插入日期格式的数据时发现,日期时间相差8个小时,原来存储在mongodb中的时间是标准时间UTC +0:00,而中国的时区是+8.00 . ...

  5. mongodb数据库连接池(java版)

    mongodb数据库接口的设计 package storm.db; import java.util.ArrayList; import com.mongodb.DB; import com.mong ...

  6. MongoDB(3)--Java 操作 MongoDB 的 API

    引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...

  7. Mongodb 笔记 - 性能及Java代码

    性能 以下数据都是在千兆网络下测试的结果 写入 数据量的增大会导致内存占满, 因为mongodb会将数据尽可能地载入内存, 索引占用的空间也很可观非安全模式下, 速度取决于内存是否占满能差一个数量级, ...

  8. 【日期-时间】Java中Calendar的使用

    主要介绍了Calendar类的使用 输出 * 时间格式化 * 当前时间:2016-12-02 16:46:27.079 * * 转换:String-->Date-->Calendar * ...

  9. MONGODB(三)——Java操作Mongo

    相比于java调用MySqlApI来操作数据库,调用Mongo要简洁容易的多.通过一个简单的样例,很容易地就可以上手 一.导入Jar包 添加Monog支持Java的jar包,这里使用的是2.9.3 & ...

随机推荐

  1. android开发(29) 自定义曲线,可拖动,无限加载

    项目需要 做一个曲线,该曲线的数据时不断加载的.如下图,当不断向左拖动时,图形曲线要随着拖动移动,并在拖动到边界时需要加载更多数据. 先看步骤: 1.在Activity里放一个surfaceView ...

  2. C/C++-STL中lower_bound与upper_bound的用法以及cmp函数

    转载于:http://blog.csdn.net/tjpuacm/article/details/26389441 不加比较函数的情况: int a[]={0,1,2,2,3}; printf(&qu ...

  3. Android开发-httpclient兼容性问题

    据说android 6.0之后已经将Apache Http Client移出SDK,build时出现“Unable to find optional library: org.apache.http. ...

  4. 超频,如何超频CPU和显卡?

    首先是良好的硬件体制,CPU.内存和显卡都必须是健康的,在100%负荷下工作也能拥有合理的温度和功耗.其次就是硬件准备,超频需要一块强大的主板做支撑,特别是主板供电部分,考虑到CPU和内存超频后功耗大 ...

  5. 图的基本算法(BFS和DFS)

    图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...

  6. (笔记)Mysql命令grant on:增加新用户并控制其权限

    grant on命令用于增加新用户并控制其权限. grant on命令格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”; 1) 增加一个用 ...

  7. mybaits if标签语句

    Mybatis if 标签可用在许多类型的 SQL 语句中,我们以查询为例.首先看一个很普通的查询: <!-- 查询用户列表,like用户名称 --> <select id=&quo ...

  8. 新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目

    之前都没试过用maven来管理过项目,但是手动找包导包确实不方便,于是今天用2016版的IDEA进行了maven的初尝试. 打开IDEA,创建新项目: 然后选择Maven,以及选择自己电脑的jdk: ...

  9. Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

    转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...

  10. EF5+MVC4系列(8) ActionResult的返回值

    我们在MVC的代码中,经常会看到这样的一个 代码 可能有人会有疑问,既然我定义的是ActionResult,为什么返回值会是View方法呢? 其实这个View方法的返回值的类型是ActionResul ...