当存储到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相关推荐

  1. JAVA中获取当前系统时间

    JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...

  2. java中io流实现哪个接口_第55节:Java当中的IO流-时间api(下)-上

    标题图 Java当中的IO流(下)-上日期和时间日期类:java.util.Date 系统时间:long time = System.currentTimeMillis();public class  ...

  3. java datetime和date_Java 8时间接口localDateTime和Date的对比

    java8提供了新的时间接口.相对Date,Calendar,个人感觉最大的好处是对时间操作的学习成本很低,比Calendar低. 1. LocalDate,LocalTime,LocalDateTi ...

  4. java+c#+json+时间_C#与Json时间的转换

    private static Int64 dt = new DateTime(1970, 1 , 1).Ticks; /// /// 传入一个DateTime,将其转换为子1970年1月1日起的Int ...

  5. Java获取当前的系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  6. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

  7. java 时间api源码,时间API(示例代码)

    1. 时间API 我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970-01-01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还 ...

  8. java定义时间格式大全_Java时间格式转换大全

    package com.date; import java.text.DateFormat; import java.text.ParseException; import java.text.Par ...

  9. java 时间轮算法_时间轮算法(TimingWheel)是如何实现的?

    前言 我在2. SOFAJRaft源码分析-JRaft的定时任务调度器是怎么做的?这篇文章里已经讲解过时间轮算法在JRaft中是怎么应用的,但是我感觉我并没有讲解清楚这个东西,导致看了这篇文章依然和没 ...

最新文章

  1. luogu P2759 奇怪的函数 二分答案+数论
  2. 一篇文章教你学会使用SpringBatch 监听器Listener
  3. 前端学习(2548):模板解析
  4. java注意的一些细节问题
  5. puts遇到空格无法输出_ACM输出超限|puts与printf
  6. C语言拾遗(二):符号重载
  7. 跨域请求的常用方式及解释
  8. SQLServer的top 100 percent用法
  9. 计算机在生物技术的应用论文,计算机技术在生物学中的应用
  10. Devise Gem简介
  11. Linux中 安装一些实用小软件总结
  12. 回文数,用scratch编程实现回文数
  13. 你知道安卓的3D Touch吗?(Shortcut详解,你想知道的我都有)
  14. 基于ppg和fft神经网络的光学血压估计【翻译】
  15. 遇到一个特别傻的问题。。。用charles抓包抓不到https的解决方法
  16. 如何使用条码标签软件的模板库
  17. 《数据可视化基础》读后感
  18. java接口注释_Java的注释和API文档
  19. 加米谷:金融领域中的大数据应用
  20. CCD、COMS,数字摄像头、模拟摄像头 区别和联系

热门文章

  1. 爱了!蚂蚁开源的“SpringBoot”框架,新增了这6项功能...
  2. CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分布式集群
  3. 哈工大C语言公开课练兵编程(二)
  4. 计算机学校的奖项,2017年度国家科学技术奖各奖项公示
  5. 移动端实现文字轮播_移动端轮播图实现
  6. mysql数据自定义随机_Mysql 自定义随机字符串
  7. 太太丘舍去_过中不至,太丘舍去,去后乃至的意思
  8. python四级考试时间_四级英语考试如何准备呢?
  9. 物料编码是计算机系统对物料,物料编码是什么?
  10. 江苏单招试题计算机原理及答案,江苏省对口单招计算机组装与维修计算机原理考题分类汇总.docx...