一、使用BasicDBObject 进行查询
查询条件设置
BasicDBObject queryCond = new BasicDBObject();
queryCond.put("data_source", "诊断记录");
queryCond.put("patient_id", new BasicDBObject("$in", patientIdList));
queryCond.put("data", new BasicDBObject("$elemMatch", new BasicDBObject("key", "EGFR").append("value", "+")));
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);
long countDocuments = mongoTemplate.getCollection("book").countDocuments(query);
System.out.println(countDocuments);
- exists 用法 1 代表存在该字段,字段值为 null的也算
queryCond.put("time_point_id", new BasicDBObject("$exists", 1));
- 指定返回字段 0代表不返回,1代表返回,_id会默认返回(不返回需手动设置为0)
BasicDBObject filterCond = new BasicDBObject();filterCond.put("_id", 0);filterCond.put("patient_id", 1);filterCond.put("data", 1);
BasicDBObject sortCond = new BasicDBObject();
sortCond.put("survey_time", 1);
MongoCursor<Document> cursor = mongoTemplate.getCollection("collection_name").find(queryCond).projection(filterCond).sort(sortCond).iterator();
while (cursor.hasNext()) {Document doc = cursor.next();Object pidObj = doc.get("patient_id");}
二、使用Query 和 Criteria 进行查询
private List<CdrData> findMedicationByPatienId(String patientId) {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);}
三、聚合查询,查出某一个字段出现次数前8的
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 {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));aggregateCondList.add(new BasicDBObject("$unwind", "$data"));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))));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();