@Override
public MessageDto getCheckInMembersByFlight(String fltDt, String fltNr, String channel,String origincd,String destcd) {
log.info("请求参数:"+"fltDt:"+fltDt+",fltNr:"+fltNr+",channel:"+channel+",origincd:"+origincd+",destcd:"+destcd);
MessageDto messageDto = new MessageDto();
boolean flag = (null !=fltDt&&!("").equals(fltDt)
&&null !=fltNr&&!("").equals(fltNr)
&&null !=channel&&!("").equals(channel)
&&null !=origincd&&!("").equals(origincd)
&&null !=destcd&&!("").equals(destcd))
&&(channel.equals("WX")|channel.equals("APP"));
if (flag) {
String fltDtStr = fltDt.replace("-","")+"000000";
//分组的依据psgId
DBObject keys = new BasicDBObject("psgId", true);
//dbObject为检索条件,检索出符合业务的数据
BasicDBObject dbObject = new BasicDBObject();
dbObject.put("fltDt", fltDtStr);
String fltNrSub = fltNr.substring(2);
dbObject.put("fltNr", fltNrSub);
dbObject.put("checkinStatus", "AC");
dbObject.put("originCd", origincd);
dbObject.put("destCd",destcd );
//设定下面函数的初始值:prev的字段dcsTimestamp的初始值,用于做比较取dcsTimestamp的最大值
DBObject initial = new BasicDBObject("dcsTimestamp", "0");
//这个属于js的语法,这个脚本用于在psgId组内,比较出较大的dcsTimestamp,并且取出这条数据中要返回的值
//注意后面的赋值要有dcsTimestamp的赋值,不然得出的数据不准确
String reduce = "function(doc,prev){" +
"var docDcsTimestamp=doc.dcsTimestamp;" +
"var prevDcsTimestamp=prev.dcsTimestamp;" +
"var docDcsTimestampInt=parseInt(docDcsTimestamp);" +
"var prevDcsTimestampInt=parseInt(prevDcsTimestamp);" +
"if(docDcsTimestampInt > prevDcsTimestampInt){" +
"prev.fqNo=doc.fqNo;" +
"prev.credentNo=doc.credentNo;" +
"prev.chnName=doc.chnName;prev.dcsTimestamp=doc.dcsTimestamp;}" +
"}";
BasicDBList dbList = (BasicDBList) mongoTemplate.getCollection("b_dep_pnr_psg").group(keys, dbObject, initial, reduce);
log.info("分组处理成功");
JSONArray resultJson = new JSONArray();
for (int i = 0; i < dbList.size(); i++) {
//取出最终的得到数据中的要返回的参数,封装到map转json返回。添加name和证件号不为空判断,其中一个为空不返回
JSONObject jsStr = JSONObject.parseObject(dbList.get(i).toString());
String fqNoStr = (String) jsStr.get("fqNo");
String chnName = (String) jsStr.get("chnName");
String credentNo = (String) jsStr.get("credentNo");
Map<String, String> map = new HashMap<String, String>();
ObjectMapper mapJson = new ObjectMapper();
if(null!=chnName&&!chnName.equals("")&&null!=credentNo&&!credentNo.equals("")){
map.put("fqNo", fqNoStr);
map.put("name", chnName);
map.put("credentNo", credentNo);
}else{
continue;
}
String params = null;
JSONObject resultJsonObiect = null;
try {
params = mapJson.writeValueAsString(map);
resultJsonObiect = JSONObject.parseObject(params);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
resultJson.add(resultJsonObiect);
}
messageDto.setMessage("成功");
messageDto.setCode("0");
messageDto.setContent(resultJson);
} else {
messageDto.setMessage("参数个数不对");
messageDto.setCode("10001");
messageDto.setContent(null);
} return messageDto;
}

  2、分组也可,

public void query1(){
String mondburl = Config.getInstance().getProperty("mongodb.host");
MongoClientOptions options = new MongoClientOptions.Builder().socketKeepAlive(true).build();
Mongo client = new MongoClient(mondburl, options);
DB database = client.getDB("pnr");
DBCollection coll = database.getCollection("b_dep_pnr_flt"); //条件
DBObject dbObject = new BasicDBObject();
dbObject.put("alnCd", "CZ");
dbObject.put("fltNr", "3452");
dbObject.put("fltDt", "20180425000000");
dbObject.put("arvCd", "SZX");
dbObject.put("depCd", "LJG");
//FindIterable<Document> dbCursor = col.find((Bson) dbObject);
/*创建 $match, 作用相当于query*/
DBObject match = new BasicDBObject("$match", dbObject); /* Group操作*/
DBObject groupFields = new BasicDBObject("_id",null);
groupFields.put("MAXDcsTimestamp", new BasicDBObject("$max", "$dcsTimestamp"));
DBObject group = new BasicDBObject("$group", groupFields); /* 查看Group结果 */
AggregationOutput output = coll.aggregate(match, group); // 执行 aggregation命令
Iterable<DBObject> results = output.results(); for (DBObject dbObject2 : results) {
System.out.println(dbObject2.toString());
} }

mongodb分组排序的更多相关文章

  1. mongodb group操作 以及管道 aggregate 分组排序分页

    分组获取数据: db.express_info.group({ "key":{"express_code":true}, "initial" ...

  2. 一条Sql语句分组排序并且限制显示的数据条数

    如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...

  3. SQL语句分组排序,多表关联排序

    SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...

  4. oracle 分组排序函数

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示例和 ...

  5. oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  6. List对象分组排序算法

    场景: List里面的对象是订单的节点,比如我们快递的物流状态,这个是需要有序的,所以需要根据订单号进行分组排序. import java.util.ArrayList; import java.ut ...

  7. js分组排序算法, OrderBy

    由于项目中需要对数据进行分组排序,类似于sql中 order by column1,column2....  实现的关键是 分组排序,第一个column1,排序完成之后,对其分组,然后按照column ...

  8. MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能

    MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能 由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQ ...

  9. WPF 视图分组排序

    视图分组排序 效果: 实现步骤: 第一步:为分组做一个标题头,就是效果图中的浅蓝色部分: <DataGrid.GroupStyle>标签部分: <DataGrid x:Name=&q ...

随机推荐

  1. java Thread 类的源码阅读(oracle jdk1.8)

    java线程类的源码分析阅读技巧: 首先阅读thread类重点关注一下几个问题: 1.start() ,启动一个线程是如何实现的? 2.java线程状态机的变化过程以及如何实现的? 3. 1.star ...

  2. K8s快速入门

    在k8s中所有的内容都抽象为资源,资源实例化之后,叫做对象.一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单 资源清单的格式: apiVersion: ...

  3. Android Studio上传代码到Coding.net

    1.官方帮助文档:https://coding.net/help/doc/git/import-from-local.html 2.简单点: https://git.coding.net/javaka ...

  4. 在Ubuntu上升级SQLite,并让Python使用新版SQLite

    (本文适用于Debian系的Linux,如Ubuntu.Raspbian等等.) 在Linux上,Python的sqlite3模块使用系统自带的SQLite引擎,然而系统自带的SQLite可能版本太老 ...

  5. Navicat Premium 12注册机使用教程

    来看下软件具体的安装.激活图文教程: 1.首先下载后正常安装软件至结束: 这时候如果打开的话,是提示要注册的 2.以管理员身份运行注册机工具 Navicat_Keygen_Patch[vxia.net ...

  6. GitHub下载提速

    通过修改hosts文件来提速(该方法也可加速其他因为CDN被屏蔽导致访问慢的网站) 第一步:获取GitHub的IP地址 通过访问:http://tool.chinaz.com/dns或者https:/ ...

  7. dubbo 面试

    1.使用dubbo+zookeeper ,如果注册中心挂掉,是否可以继续通信?(zk集群可以达到高可用,但是如果全部挂掉呢?) 我答了不可以吧(项目没用过,自学没又这深度) 正确答案: dubbo使用 ...

  8. linux命令——wc

    wc 统计文件里面有多少单词,多少行,多少字符. wc语法 [root@www ~]# wc [-lwm] 选项与参数: -l :仅列出行: -w :仅列出多少字(英文单字): -m :多少字符: 默 ...

  9. 【Spring学习】【Java基础回顾-数据类型】

    Java基础回顾过程中,之前对于Java相关基础知识都是从这个人的博客看一些,那边的内容看一下,觉得不够系统化,决定用xmind脑图的形式,将Java基础知识回顾的作为一个系列,当前正在做的会包含: ...

  10. java_24.1文件流的应用--复制文件

    注意:先开的流要最后关 用字节流传输 public class Demo { public static void main(String[] args){ FileInputStream fis = ...