1、创建一个 QueryBuilder private QueryBuilder getQueryBuilder(PersonRecordQueryDTO personRecordQueryDTO) { log.debug('get personRecords by query : {}', personRecordQ ..

Spring Data MongoDB 的复杂查询示例

本贴最后更新于 263 天前,其中的信息可能已经物是人非

1、创建一个 QueryBuilder

private QueryBuilder getQueryBuilder(PersonRecordQueryDTO personRecordQueryDTO) {
    log.debug("get personRecords by query : {}", personRecordQueryDTO);
  QueryBuilder queryBuilder = new QueryBuilder();

 if (personRecordQueryDTO.getPersonType().equals(PersonType.PERSON_TYPE_STRANGER)) {
        // 陌生人
  queryBuilder.and("isMatched").is(false);
  } else {
        if (personRecordQueryDTO.getPersonType().equals(PersonType.PERSON_TYPE_STAFF)) {
            queryBuilder.and("matched.type").is(PersonType.PERSON_TYPE_STAFF.toString());
  } else {
            queryBuilder.and("matched.type").is(PersonType.PERSON_TYPE_VIP.toString());
  }
        if (Objects.nonNull(personRecordQueryDTO.getName())) {
            queryBuilder.and("matched.name").regex(Pattern.compile("^.*" + personRecordQueryDTO.getName() + ".*$"));
  }
    }
    // 时间条件
  getQueryBuild(personRecordQueryDTO.getStartTime(), personRecordQueryDTO.getEndTime(), queryBuilder);
  if (Objects.nonNull(personRecordQueryDTO.getIps()) && personRecordQueryDTO.getIps().size() != 0) {
        queryBuilder.and("ipc_ip").in(personRecordQueryDTO.getIps());
  }
    log.debug("mongo is : {}", queryBuilder.get());
 return queryBuilder;
}

2、查询

public Page getPersonRecords(PersonRecordQueryDTO personRecordQueryDTO, Pageable pageable) {
QueryBuilder queryBuilder = getQueryBuilder(personRecordQueryDTO);
//查询结果集条件
BasicDBObject fieldsObject = new BasicDBObject();
Query query = new BasicQuery(queryBuilder.get().toString(), fieldsObject.toJson());
// 总页数
long total = mongoTemplate.count(query, PersonRecordMongoDB.class);
//查询结果集
List list = mongoTemplate.find(query.with(pageable), PersonRecordMongoDB.class);
//手动分页
return new PageImpl<>(list, pageable, total);
}

3、排序

QueryBuilder queryBuilder = new QueryBuilder();
if (Objects.nonNull(ipcIds) && !ipcIds.isEmpty()) {
    queryBuilder.and("ipc_ip").in(ipcIds.split(","));
}
queryBuilder.and("matched._id").is(personId);
getQueryBuild(startTime, endTime, queryBuilder);
Sort sort = new Sort("show_time");
log.debug("query sql is {}", queryBuilder.get());
sort.descending();
//查询结果集条件
BasicDBObject fieldsObject = new BasicDBObject();
Query query = new BasicQuery(queryBuilder.get().toString(), fieldsObject.toJson());
return mongoTemplate.find(query.with(sort), PersonRecordMongoDB.class);

  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    49 引用 • 45 回帖 • 3 关注
回帖   
请输入回帖内容...