Mongodb利用aggregation实现抽样查询(按记录数和时间)
之前对mongodb不熟,但是项目要用,因为数据量比较大,并且领导要实现抽样查询,控制数据流量,所以自己研究了下,亲测可用,分享一下!
话不多说,上代码:
第一种方案:加自增主键,实现按记录数抽样
1、记录在存入数据库时不适用默认id,改为自增id,具体实现如下:
- /**
- * 序列类,用于映射查询的序列值
- * @author Administrator
- *
- */
- public class MongoSequence {
- @Id
- private String id;
- private int seq;
- }
- /**
- * 获取序列号工具类
- * @author Administrator
- *
- */
- @Component
- public class MongoAutoidUtil {
- @Autowired
- MongoTemplate mongoTemplate;
- public int getNextSequence(String collectionName) {
- Query query = new Query(Criteria.where("collName").is(collectionName));
- Update update = new Update();
- update.inc("seq", 1);
- FindAndModifyOptions options = new FindAndModifyOptions();
- options.upsert(true);
- options.returnNew(true);
- MongoSequence seqId = mongoTemplate.findAndModify(query, update, options, MongoSequence.class);
- return seqId.getSeq();
- }
- }
- //插入数据
- public void insert(DeviceData110 de) {
- de.setId(mongoAutoidUtil.getNextSequence(de.getParamName()));
- mongoTemplate.save(de,de.getParamName());
- }
2、查询数据,具体实现如下:
- @Autowired
- private MongoTemplate mongoTemplate;
- public List<DeviceData110> find() {
- ProjectionOperation dateProjection = Aggregation.project("_id","paramName","retrieveTime");
- MatchOperation match1 = Aggregation.match(new Criteria("paramName").is("aaa"));
- MatchOperation match2 = Aggregation.match(new Criteria("retrieveTime").gte(DateUtil.getAssignTime(new Date(), -1)).lte(DateUtil.getAssignTime(new Date(), 1)));
- MatchOperation match3 = Aggregation.match(new Criteria("_id").mod(2, 0));
- Aggregation agg = Aggregation.newAggregation(dateProjection,match1,match2,match3);
- AggregationResults<DeviceData110> results = mongoTemplate.aggregate(agg,"aaa",DeviceData110.class);
- List<DeviceData110> list = results.getMappedResults();
- return list;
- }
- //实体类
- public class DeviceData110 implements Serializable{
- private static final long serialVersionUID = -4763630558724084819L;
- public int id;
- public String paramName;
- public Date retrieveTime;
- }
在demo中可以查询到按paramName为"aaa",retrieveTime为一天前至今,并且id值除以2余数为0的所有记录,更改除数的大小便实现了不同粒度的抽样查询。
第二种方案:借助 date aggragation ,实现按时间查询
前提是被查询数据中有字段为iso date类型retrieveTime,然后在aggregation中加入一个这样的MatchOperation,最后加入到Aggregation.newAggregation()即可实现查询分钟数为0,15,30,45的记录,同时支持的其它操作还有hour、seconds等。
- ProjectionOperation project1 = Aggregation.project("_id").andExpression("minute(retrieveTime)").as("minute"),
- MatchOperation match = Aggregation.match(new Criteria("minute").in("0","15","30","45"));
- Aggregation agg = Aggregation.newAggregation(project1 、match );
Mongodb利用aggregation实现抽样查询(按记录数和时间)的更多相关文章
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- MongoDB(六):选择字段、限制记录数、排序记录
1. 选择字段 在MongoDB中,选择字段又叫投影,表示仅选择所需要字段的数据,而不是选择整个文档字段的数据.如果某个文档有5个字段,但只要显示3个字段,那么就只选择3个字段吧,这样做是非常有好处的 ...
- 优化mybatis框架中的查询用户记录数的案例
通过对mybatis框架的中核心接口和类的分析,发现之前写的那个小demo是有问题的.现在对其进行部分优化. 如果存在多个功能的时候,势必会有很多重复的代码,如,创建sqlsession对象,关闭sq ...
- mysql 数据操作 单表查询 limit 限制查询的记录数
mysql; +----+-----------+------+-----+------------+---------+--------------+------------+--------+-- ...
- Hibernate查询总的记录数
1. 原生sql String hql="select count(*) from product" ;//此处的product是数据库中的表名 Query query=sessi ...
- 使用传入的总记录数实现一条sql语句完成分页查询
使用传入的总记录数实现一条sql语句完成分页查询 问题:在传统的分页查询的实现中不可避免的需要两条sql语句,一条用于查询数据一条用于查询总记录数.如下面的实际代码所示: Img1 当然如果使 ...
- Oracle查询数据库中所有表的记录数
1.Oracle查询数据库中所有表的记录数,但是有可能不准建议用第二种方式进行查询 select t.table_name,t.num_rows from user_tables t 2.创建orac ...
- myBatis框架_关于怎么获得多表查询的总记录数
<!-- 查找总记录数 --> <select id="billCount" resultType="int"> select coun ...
- mysql数据库补充知识2 查询数据库记录信息之单表查询
一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...
随机推荐
- 20169205实验一 Java开发环境的熟悉(Linux+IDEA)
20169205实验一 Java开发环境的熟悉(Linux+IDEA) 实验内容及步骤 使用JDK编译.运行简单的Java程序 打开windows下的cmd → 输入cd Code命令进入Code目录 ...
- Android-获取网络图片设置壁纸
下载图片,设置壁纸 的代码: package liudeli.async; import android.app.Activity; import android.app.ProgressDialog ...
- 键盘控制背景边框平滑移动(jquery)
今天同事让我看了一个动画效果,是由键盘控制背景边框平滑移动,我感觉挺cool,所以我自己也动手制作了一个.目的是为了锻炼自己,看自己是否也能在短时间内实现. 先上图: 一.html代码 <!DO ...
- 教你制作高逼格的技术分享Keynote(PPT)
本文来自 网易云社区 . 作为一个程序猿/媛,想必大家都参与过大大小小各式各样的技术分享,异或在不同的场合分享自己的技术心得.抛开分享内容的质量不谈,笔者发现通常这些分享者的演示文稿(Keynot或P ...
- 各大SRC中的CSRF技巧
本文作者:i春秋签约作家——Max. 一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/ses ...
- [转] HTTP状态码错误代码
一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 详细分解: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 ...
- 量化分析获取数据的3种姿势(压箱底的神器Tushare)
自打入门量化分析起,就有相当部分的时间在与数据打交道,从数据的获取.清洗到使用,对分析而言既是繁琐的,也是必须的.有大牛曾经说,量化分析有8成的开发时间都在处理数据. 为了节省时间,将更多精力投入到策 ...
- Azure Powershell获取Azure虚拟机的操作系统型号及具体版本
Azure ARM 模式虚拟机: 1.登陆Azure账号 Add-AzureRmAccount -EnvironmentName AzurechinaCloud 2.选择指定订阅 Select-Azu ...
- handlersocket优缺点
HandlerSocket的优势和特点: 1) 支持多种查询模式 HandlerSocket目前支持索引查询(主键索引和非主键的普通索引均可),索引范围扫描,LIMIT子句,也即支持增 ...
- js 实现tab栏切换效果
效果图: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...