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-分组分页的更多相关文章

  1. NodeJs操作MongoDB之分页功能与常见问题

    NodeJs操作MongoDB之分页功能与常见问题 一,方法介绍 1,聚合操作之count count()方法可以查询统计符合条件的集合的总数 db.User.count(<query>) ...

  2. springboot+mongodb 按日期分组分页查询

    List<Integer> types = new ArrayList<>(); types.add("条件1"); types.add("条件2 ...

  3. MongoDB分组汇总操作,及Spring data mongo的实现

    转载请在页首注明作者与出处 一:分组汇总 1.1:SQL样例 分组汇总的应用场景非常多,比如查询每个班级的总分是多少,如果用关系形数据库,那么sql是这样子的 ),class from score g ...

  4. Node.js、express、mongodb 实现分页查询、条件搜索

    前言 在上一篇Node.js.express.mongodb 入门(基于easyui datagrid增删改查) 的基础上实现了分页查询.带条件搜索. 实现效果 1.列表第一页. 2.列表第二页 3. ...

  5. mongodb 分组查询

    数据的保存 include_once 'mDB.class.php'; $m=new mDB(); $m->setDB('mydb'); // $m->save('stu',['dept' ...

  6. mongodb分组,的两种方式,先记一下

    using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Builders; using NationalUnion.AdGalle ...

  7. C# 操作mongodb 分组

    c#操作mongodb的分组的简单例子: 1.首先要下载c#对应的mongodb驱动,官方下载地址:https://github.com/mongodb/mongo-csharp-driver/rel ...

  8. mongodb中分页显示数据集的学习

    这次继续看mongodb中的分页.首先依然是插入数据: 1) db.Blog.insert( { name : "Denis",  age : 20, city : "P ...

  9. MongoDB,分组,聚合

    使用聚合,db.集合名.aggregate- 而不是find 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数.MongoDB的聚合管道将MongoDB文档在一个管道处理完 ...

  10. MongoDB分组

    MongoDB三种分组方式 group(先筛选再分组,不支持分片,对数据量有所限制,效率不高) [简单分组实测150W 12.5s] mapreduce(基于js引擎,单线程执行,效率较低,适合用做后 ...

随机推荐

  1. ZOJ2481 Unique Ascending Array 2017-04-18 23:08 33人阅读 评论(0) 收藏

    Unique Ascending Array Time Limit: 2 Seconds      Memory Limit: 65536 KB Given an array of integers ...

  2. 树和二叉树在java中

    树代表一种非线性的数据结构,如果一组数组节点之间存在复杂的一对多关联时,程序就可以考虑使用树来保存这组数据了. 线性表.栈和队列都是线性的数据结构,这种数据结构之内的元素只存在一个对一个的关系.存储, ...

  3. SQL 数据库开发一些精典的代码(转自 咏南工作室)

    1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密: s ...

  4. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...

  5. Unity Shader序列帧动画学习笔记

    Unity Shader序列帧动画学习笔记 关于无限播放序列帧动画的一点问题 在学shader的序列帧动画时,书上写了这样一段代码: fixed4 frag(v2f i){ // 获得整数时间 flo ...

  6. .NET 简易方法拦截器

    伟大的无产阶级Willaim曾说过:"无论你觉得自己多么的了不起,也永远有人比你更强".对,我说过!我就是william. 今天想记录一下在项目中遇到的一个比较有意思的东西,异常拦 ...

  7. C#构造方法(函数)

    一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初始化对象的,为类的成员赋值 ...

  8. Webapi上传数据(XML)敏感字符解决方案

    方法名加特性 [ValidateInput(false)] 配置文件加 <httpRuntime requestValidationMode="2.0" targetFram ...

  9. Swagger 导出API

    Swagger 导出API 这算是在博客园的第一篇博客吧,之后发的应该也会同步到博客园上. 此前的博客地址: https://blog.mytyiluo.cn Swagger简介 Swagger是一个 ...

  10. S11 day 94 RestFramework 之 APIView视图

    VIEW视图(Django自带的) 1.  url url(r'login/$', views.login.as_view()), 2.点开 as_view() , as_view()为类方法.  l ...