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();
相关推荐
数据智能老司机4 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
似水流年流不尽思念4 小时前
MongoDB 有哪些索引?适用场景?
后端·mongodb
数据智能老司机5 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机5 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机5 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i5 小时前
drf初步梳理
python·django
每日AI新事件5 小时前
python的异步函数
python
这里有鱼汤6 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook15 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室16 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python