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引擎,单线程执行,效率较低,适合用做后 ...
随机推荐
- SSH框架中配置log4j的方法
SSH框架中使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下.2. 把log文件定在 /WEB- ...
- 好久不发帖,转一下公司技术美术独立完成的U3D模拟暗黑泰瑞尔翅膀物理运动效果
想入公司倍培养成为优秀的技术型美术,欢迎call我! Max制作翅膀模型部分 新建一个片面,模型给一些段数,赋予一张左右二方连续贴图. 加个FFD 4*4*4,并稍微拉出一点弧度. 将头尾的Alpha ...
- asp.net Mvc 模型绑定项目过多会导致页面运行时间卡
asp.net Mvc 模型绑定项目过多会导致页面运行时间卡的问题. 解决方式就是采用ModelView方式进行精简,已减少模型绑定及验证的时间.
- Asp.net Core 2.1 Kestrel 现在支持 多协议处理(Tcp)
地址:https://github.com/davidfowl/MultiProtocolAspNetCore.git 在一个Kestrel服务上可以同时处理Tcp,Http,Https等多种协议. ...
- 在Docker中运行纸壳CMS并配置使用MySql
纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...
- MahApps.Metro扁平化UI控件库(可修改主题色等)
一.名词解释 使用MahApps.Metro扁平化UI控件库,可以使界面呈现更加美观.本文将总结MahApps.Metro的使用方法,及如何自定义修改其主题颜色等. 详细内容可参考官网:https:/ ...
- C++解析头文件-Qt自动生成信号定义
目录 一.概述 二.实现思路 三.代码讲解 1.类图 2.QtCppDescription 3.测试 四.源代码 一.概述 上一篇文章C++解析头文件-Qt自动生成信号声明我们主要讲解了怎么去解析C+ ...
- UCS2-little endian转码(utf16)
public static void readFile(){ BufferedReader in = null; try { in = new BufferedReader(new InputStre ...
- 三,memcached服务的两种访问方式
memcached有两种访问方式,分别是使用telnet访问和使用php访问. 1,使用telnet访问memcacehd 在命令提示行输入, (1)连接memcached指令:telnet 127. ...
- WebBench源码分析
源码分析共享地址:https://github.com/fivezh/WebBench 下载源码后编译源程序后即可执行: sudo make clean sudo make & make in ...