mongodb-分组分页
1, 添加测试数据
@Test
public void save() {
News n = null;
for (int i = ; i < ; i++) {
n = new News();
n.setTitle("title_" + i);
n.setUrl("url_" + i); //2014-01-01到2014-01-01之间的随机时间
Date randomDate=DateUtil.randomDate("2014-01-01","2014-05-11");
//MongoDB里如果时间类型存的是Date,那么会差8个小时的时区,因为MongoDB使用的格林威治时间,中国所处的是+8区,so……
//比如我保存的是2014-05-01 00:00:00,那么保存到MongoDB里则是2014-05-01 08:00:00,所以为了统一方面,那就保存字符串类型,底下保存的long类型
n.setPublishTimeStr(DateUtil.formatDateTimeByDate(randomDate));
//long类型在查询速度中肯定会比较快
n.setPublishTime(randomDate.getTime());
n.setPublishDate(randomDate); n.setPublishMedia("publishMedia_" + i); String[] areaArr = {"", "", "", "", "", "", "", "", ""
, "", "", "", "", "", "", "", ""
, "", "", "", "", "", "", "", ""};
int areaNum=(int)(Math.random() * areaArr.length);//产生0-strs.length的整数随机数
String area = areaArr[areaNum];
n.setArea(area); String[] ckeyArr = {"A101", "A102", "A201", "A202", "A203"
, "B101", "B102", "B103", "C201", "C202", "C203", "", "", "", "", ""};
int ckeyNum=(int)(Math.random() * ckeyArr.length);//产生0-strs.length的整数随机数
List<String> list = new ArrayList<String>();
for (int j = ; j < ckeyNum; j ++) {
int ckeyNum1=(int)(Math.random() * ckeyArr.length);//产生0-strs.length的整数随机数
list.add(ckeyArr[ckeyNum1]);
}
n.setClassKey(list); Integer[] evalArr = {, };
int evalNum=(int)(Math.random() * evalArr.length);//产生0-strs.length的整数随机数
n.setEvaluate(evalArr[evalNum]); Integer[] mproArr = {, , };
int mproNum=(int)(Math.random() * mproArr.length);//产生0-strs.length的整数随机数
n.setMediaProperty(mproArr[mproNum]); Integer[] mtypeArr = {, , , , , , , , , , };
int mtypeNum=(int)(Math.random() * mtypeArr.length);//产生0-strs.length的整数随机数
n.setMediaType(mtypeArr[mtypeNum]); Integer[] levelArr = {, , , , , , , , , , , };
int levelNum=(int)(Math.random() * levelArr.length);//产生0-strs.length的整数随机数
n.setLevel(levelArr[levelNum]); newsService.save(n);
}
System.out.println("OK");
}
2, 使用 dbCollection进行分页:
/**
*
* 功能:使用Mongo本身提供的AggregationOutput进行分组查询
* 参数:
* 创建人:OnTheRoad_Lee
* 修改人:OnTheRoad_Lee
* 最后修改时间:2014-5-26
*/
public void testGroup1 () {
//按照eval字段进行分组,注意$eval必须是存在mongodb里面的字段,不能写$evaluate(此字段是News类中定义的,和存入mongodb中的有区别)
//{$group:{_id:{'AAA':'$BBB'},CCC:{$sum:1}}}固定格式:把要分组的字段放在_id:{}里面,BBB是mongodb里面的某个字段,AAA是BBB的重命名,CCC是$sum:1的重命名
//此查询语句== select eval as eval, count(*) as docsNum from news group by eval having docsNum>=85 order by docsNum desc
//具体的mongodb和sql的对照可以参考:http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/
String groupStr = "{$group:{_id:{'eval':'$eval'},docsNum:{$sum:1}}}";
DBObject group = (DBObject) JSON.parse(groupStr);
String matchStr = "{$match:{docsNum:{$gte:85}}}";
DBObject match = (DBObject) JSON.parse(matchStr);
String sortStr = "{$sort:{_id.docsNum:-1}}";
DBObject sort = (DBObject) JSON.parse(sortStr);
AggregationOutput output = mongoTemplate.getCollection("news").aggregate(group, match, sort);
System.out.println(output.getCommand());
//转换为执行原生的mongodb查询语句
//{ "aggregate" : "news" , "pipeline" : [ { "$group" : { "_id" : { "eval" : "$eval"} , "docsNum" : { "$sum" : 1}}} , { "$match" : { "docsNum" : { "$gte" : 85}}} , { "$sort" : { "_id.docsNum" : -1}}]}
System.out.println(output.getCommandResult());
//查询结果
//{ "serverUsed" : "localhost/127.0.0.1:47017" , "result" : [ { "_id" : { "evaluate" : 1} , "docsNum" : 9955} , { "_id" : { "evaluate" : 0} , "docsNum" : 10047}] , "ok" : 1.0} //也可以把查询结果封装到NewsNumDTO,这样以一个dto对象返回前台操作就更容易了
NewsNumDTO dto = new NewsNumDTO();
for( Iterator< DBObject > it = output.results().iterator(); it.hasNext(); ){
BasicDBObject dbo = ( BasicDBObject ) it.next();
BasicDBObject keyValus = (BasicDBObject)dbo.get("_id");
int eval = keyValus.getInt("eval");
long docsNum = ((Integer)dbo.get("docsNum")).longValue();
if(eval == ){
dto.setPositiveNum(docsNum);
}else {
dto.setNegativeNum(docsNum);
}
} }
3, 使用mongotemplate 进行分组分页
/**
* 按日期排序显示错误的poi信息
*/
@Override
public PageEntity<GroupEntity> getFaildPoisByPage(Long page, Integer pageSize) { Criteria criteria = Criteria.where("status").is();
Aggregation aggregationall = Aggregation.newAggregation(Aggregation.match(criteria),
Aggregation.group("task_ids").count().as("totalCount"),
Aggregation.sort(Sort.Direction.DESC, "totalCount"));
AggregationResults<GroupEntity> aggResall = mongoTemplate.aggregate(aggregationall, "scrapy_error_pois",
GroupEntity.class);
List<GroupEntity> listResall = aggResall.getMappedResults();
long totalCount = listResall.size();
System.out.println(totalCount); PageEntity<GroupEntity> pageEntity = new PageEntity<>();
pageEntity.setPage(page);
pageEntity.setPageSize(pageSize);
pageEntity.setTotalCount(totalCount);
@SuppressWarnings("deprecation")
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),
Aggregation.group("task_ids").count().as("totalCount"),
Aggregation.sort(Sort.Direction.DESC, "totalCount"), Aggregation.skip(pageEntity.getStart().intValue()),
Aggregation.limit(pageSize));
// Aggregation.skip(1), Aggregation.limit(3));
// System.out.println("--mongoDBSQL--" + aggregation.toString());
AggregationResults<GroupEntity> aggRes = mongoTemplate.aggregate(aggregation, "scrapy_error_pois",
GroupEntity.class);
// BasicDBList bdbl =(BasicDBList) aggRes.getRawResults().get("result");
List<GroupEntity> listRes = aggRes.getMappedResults();
for (GroupEntity error : listRes) {
ScrapyJob scrapyJob = mongoTemplate.findOne(
Query.query(Criteria.where("_id").is(error.get_id().split(", *")[])), ScrapyJob.class);
// error.setTask_one_id(scrapyJob.getTask_name());
error.setTask_one_id(scrapyJob == null ? DateUtils.getDate() : scrapyJob.getTask_name()); // System.out.println(error.get_id());
}
pageEntity.setRows(listRes);
return pageEntity;
}
原地址: http://www.cnblogs.com/ontheroad_lee/p/3756247.html
http://ask.csdn.net/questions/237974
mongodb-分组分页的更多相关文章
- NodeJs操作MongoDB之分页功能与常见问题
NodeJs操作MongoDB之分页功能与常见问题 一,方法介绍 1,聚合操作之count count()方法可以查询统计符合条件的集合的总数 db.User.count(<query>) ...
- springboot+mongodb 按日期分组分页查询
List<Integer> types = new ArrayList<>(); types.add("条件1"); types.add("条件2 ...
- MongoDB分组汇总操作,及Spring data mongo的实现
转载请在页首注明作者与出处 一:分组汇总 1.1:SQL样例 分组汇总的应用场景非常多,比如查询每个班级的总分是多少,如果用关系形数据库,那么sql是这样子的 ),class from score g ...
- Node.js、express、mongodb 实现分页查询、条件搜索
前言 在上一篇Node.js.express.mongodb 入门(基于easyui datagrid增删改查) 的基础上实现了分页查询.带条件搜索. 实现效果 1.列表第一页. 2.列表第二页 3. ...
- mongodb 分组查询
数据的保存 include_once 'mDB.class.php'; $m=new mDB(); $m->setDB('mydb'); // $m->save('stu',['dept' ...
- mongodb分组,的两种方式,先记一下
using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Builders; using NationalUnion.AdGalle ...
- C# 操作mongodb 分组
c#操作mongodb的分组的简单例子: 1.首先要下载c#对应的mongodb驱动,官方下载地址:https://github.com/mongodb/mongo-csharp-driver/rel ...
- mongodb中分页显示数据集的学习
这次继续看mongodb中的分页.首先依然是插入数据: 1) db.Blog.insert( { name : "Denis", age : 20, city : "P ...
- MongoDB,分组,聚合
使用聚合,db.集合名.aggregate- 而不是find 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数.MongoDB的聚合管道将MongoDB文档在一个管道处理完 ...
- MongoDB分组
MongoDB三种分组方式 group(先筛选再分组,不支持分片,对数据量有所限制,效率不高) [简单分组实测150W 12.5s] mapreduce(基于js引擎,单线程执行,效率较低,适合用做后 ...
随机推荐
- android图形系统概述
简介 本文讲解的内容是Android4.1以后的系统机制,将从整体上分析Android图形显示系统的结构,不深入分析每一层内部的代码实现,更多的是使用流程图和结构图来让大家理解Android是如何绘制 ...
- 挂载镜像SD卡的FAT32文件系统分区到Linux中
首先使用fdisk –l命令查看sd卡的分区息 可以看到,sd卡有三个分区,第一个分区是FAT32系统,主要存放内核img文件和dtb文件,第二个分区是Linux系统分区,第三个分区格式未知,实际是U ...
- 16、Docker的网络-host和none
16.1 none 创建一个容器使用网络none: [root@docker ~]# docker run -d --name test1 --network none busybox /bin/ ...
- 章文嵩博士和他背后的负载均衡(LOAD BANLANCER)帝国
案首语: 阿里集团技术大牛,@正明,淘宝基础核心软件研发负责人.LVS创始人.阿里云首席科学家章文嵩博士从阿里离职,去追求技术人生另一段历程,让阿里像我一样的很多热爱技术的工程师都有一丝牵动和感触. ...
- delphi自带的SHA1算法
delphi自带的SHA1算法 uses IdHashSHA, IdGlobal; function SHA1(Input: String): String; begin with TIdHashSH ...
- Android开发消除横向排列的多个Button之间的空隙
一.问题重述 摘要里描述的可能不太清楚,问题如下图: 如何消除Button1和Button2之间的空隙,以及Button与左右边界之间的空隙? 二.问题根源 这里出现的空隙其实是Button的背景图片 ...
- [JS] 数据双向绑定原理
通常在前端开发过程中,经常遇到需要绑定两个甚至多个元素之间的值,比如将input的值绑定到一个h1上,改变input的值,h1的文字也自动更新. <h1 id="title" ...
- MongoDB VUE的下载及安装
下载: mongo vue官网地址:http://www.mongovue.com/ 安装: 很简单,注意的是:在提示buy 和 OK 的时候点击OK即可: 连接: 默认连接(无用户名密码): 在启 ...
- Regularjs是什么
本文由作者郑海波授权网易云社区发布. 此文摘自regularjs的指南, 目前指南正在全面更新, 把老文档的[接口/语法部分]统一放到了独立的 Reference页面. Regularjs是基于动态模 ...
- 字符串写入txt文件
将字符串写入C盘txt文件里 File.AppendAllText(@"C:\" + DateTime.Now.ToString("HHmmss") + &qu ...