Query、BasicDBObject、BasicDBList查询mongodb不同使用方式

一、使用Query 和 Criteria 进行查询

方式1

java 复制代码
/**
     *根据patient_id获取MetadataHis中form_data.ZLFF=Immune的数据,返回结果按照exam_time升序排序
     */
    private List<CdrData> findMedicationByPatienId(String patientId) {
        //设置mongo查询条件
        Query query = new Query();
        Criteria c =new Criteria();
        c.and("patient_id").is(patientId);
        c.and("sub_source").is("用药史");
        c.and("data").elemMatch(Criteria.where("key").is("ZID").and("value").is(groupIdVal));
        query.addCriteria(c);
        query.addCriteria(Criteria.where("data.key").is("Immune"));
        query.with(new Sort(Sort.Direction.ASC, "survey_time"));
        return mongoTemplate.find(query, CdrData.class);
    }

方式2

java 复制代码
Query query = new Query(Criteria.where("updateTime").lte(LocalDateTime.now()).gte(LocalDateTime.now().minusMonths(5)));
Book book = mongoTemplate.findOne(query, Book.class);

二、使用BasicDBObject 进行查询

查询条件设置

java 复制代码
BasicDBObject queryCond = new BasicDBObject();
  • 单个字段
java 复制代码
queryCond.put("data_source", "诊断记录"); 

相当于

java 复制代码
db.collect.find({"data_source":"诊断记录"})
  • in 的用法
java 复制代码
queryCond.put("patient_id", new BasicDBObject("$in", patientIdList));
  • 数组字段中匹配多个符合条件的值
java 复制代码
queryCond.put("data", new BasicDBObject("$elemMatch", new BasicDBObject("key", "EGFR").append("value", "+")));
java 复制代码
BasicDBObject query = new BasicDBObject();
BasicDBObject basicDbObject = new BasicDBObject();
LocalDateTime startTime = LocalDateTime.now();
basicDbObject.append("$gte", startTime.minusMonths(5));
basicDbObject.append("$lte", startTime.plusHours(2));
query.put("updateTime", basicDbObject);
MongoCursor<Document> book = mongoTemplate.getCollection("book").find(query).iterator();
while (book.hasNext()) {
	Document doc = book.next();
	Object pidObj = doc.get("_id");
	System.out.println(pidObj);
        }
  • exists 用法 1 代表存在该字段,字段值为 null的也算
java 复制代码
queryCond.put("time_point_id", new BasicDBObject("$exists", 1));
  • 指定返回字段 0代表不返回,1代表返回,_id会默认返回(不返回需手动设置为0)
java 复制代码
 BasicDBObject filterCond = new BasicDBObject();
 filterCond.put("_id", 0);
 filterCond.put("patient_id", 1);
 filterCond.put("data", 1);
  • 设置字段排序 1表示升序,-1表示倒序
java 复制代码
BasicDBObject sortCond = new BasicDBObject();
sortCond.put("survey_time", 1);

查询结果

java 复制代码
MongoCursor<Document> cursor = mongoTemplate.getCollection("collection_name").find(queryCond).projection(filterCond).sort(sortCond).iterator();

遍历结果

java 复制代码
while (cursor.hasNext()) {
       Document doc = cursor.next();
       Object pidObj = doc.get("patient_id");
}

三、 BasicDBList

BasicDBList可以存放多个BasicDBObject条件

例如:我们查询onumber=002OR cname=zcy1

java 复制代码
BasicDBList basicDBList=new BasicDBList();
basicDBList.add(new BasicDBObject("onumber","002"));
basicDBList.add(new BasicDBObject("cname","zcy1"));
DBObjectobj =new BasicDBObject();
obj.put("$or", basicDBList);
Query query=new BasicQuery(obj);

相当于

java 复制代码
db.orders.find({$or:[{"onumber":"002"},{"cname":"zcy1"}]})

basicDBList.add方法是添加一个文档的查询条件

四、聚合查询,查出某一个字段出现次数前8的

java 复制代码
  BasicDBObject queryCond = new BasicDBObject();
 
  queryCond.put("patient_id", new BasicDBObject("$in", patientTransferDepRepository.getPatientIdsByDep(depId)));
 Date startDate = null;
        Date endDate = null;
        if (month == null) {
            //统计当前年份 全部数据
            startDate = DateUtils.getYearFirst(year);
            endDate = DateUtils.getYearLast(year);
        } else {
            //统计当前 年-月 数据
            //手术时间在当年当月第一天和最后一天时间范围内(工具类month从0开始,此处month是从1开始,所以month-1)
            startDate = DateUtils.getFirstDayOfMonth(year, month-1);
            endDate = DateUtils.getLastDayOfMonth(year, month-1);
        }
        queryCond.put("survey_time", new BasicDBObject("$gte", DateUtils.parseDate(DateUtils.formatDate(startDate)+ " 00:00:00")).append("$lte", DateUtils.parseDate(DateUtils.formatDate(endDate)+ " 23:59:59")));
        aggregateCondList.add(new BasicDBObject("$match", queryCond));
 
        //unwind
        aggregateCondList.add(new BasicDBObject("$unwind", "$data"));
        // ZDLB 改为 手术名称的code(SSMC)
        aggregateCondList.add(new BasicDBObject("$match", new BasicDBObject("data.key", "SSMC")));
 
        //聚合条件 取出该年该月 手术名称:相应次数
        aggregateCondList.add(new BasicDBObject("$group", new BasicDBObject("_id", "$data.value").append("count" , new BasicDBObject("$sum", 1))));
 
        //排序,取手术名称对应次数前8的
        aggregateCondList.add(new BasicDBObject("$sort", new BasicDBObject("count", -1)));
        aggregateCondList.add(new BasicDBObject("$limit", 8));
 
        Map<String, Integer> resultMap = new LinkedHashMap<>(8);
        //遍历结果集
        MongoCursor<Document> cursor = mdcMongoTemplate.getCollection(CDR_DATA).aggregate(aggregateCondList).iterator();
相关推荐
天天被压力17 分钟前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力23 分钟前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
ATMQuant43 分钟前
量化策略开发08:Lasso因子选择 - 因子动物园的断舍离
python·量化交易·lasso·vnpy·多因子选股
ATMQuant3 小时前
量化指标解码21:逻辑回归支撑阻力 - 让逻辑回归给关键价位打分
python·机器学习·逻辑回归·量化交易·技术指标
q0371803 小时前
深色 IDE 截图 OCR 老是漏字,我加了一层预处理,顺手把识别结果做成了可搜索历史
python
蜗牛8754 小时前
个人机票监控开源项目:6 个平台、10 条通道的自托管方案
python
秋名山小白4 小时前
Playwright UI 自动化测试实战教程
python·ui
AI源码5 小时前
基于 Python 的汽车市场数据分析与可视化平台
python·数据分析·汽车
会飞锦鲤5 小时前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
没差c6 小时前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar