当前位置: 代码迷 >> 综合 >> Spring boot中mongoDB的查询--Query, QueryBuilder、BasicQuery
  详细解决方案

Spring boot中mongoDB的查询--Query, QueryBuilder、BasicQuery

热度:52   发布时间:2024-01-05 09:14:49.0

NoSQL在日常项目中的使用越来越普遍,尤其以mongoDB为甚。而java开发我们最常使用的框架非spring系列莫属。 因此本文主要介绍如何使用如何使用MongoTemplate进行查询,本文不包含如何使用spring-data-monog中的MongoRepository进行查询,MongoRepository会在其他博文中介绍。

我们可以直接在服务中使用MongoTemplate, 然后依据业务在controller’、或者其他地方调用查询,本文为了简单起见,直接在controller中调用MongoTemplate的查询方法。

  • Query

我们先看看query,MongoTemplate中大量方法就是使用query进行查询。

    public <T> T findOne(Query query, Class<T> entityClass) public <T> T findOne(Query query, Class<T> entityClass, String collectionName)public boolean exists(Query query, Class<?> entityClass)public boolean exists(Query query, String collectionName)public boolean exists(Query query, Class<?> entityClass, String collectionName) public <T> List<T> find(Query query, Class<T> entityClass) public <T> List<T> find(Query query, Class<T> entityClass, String collectionName) public <T> T findById(Object id, Class<T> entityClass) public <T> T findById(Object id, Class<T> entityClass, String collectionName) ...

我们再看看Query自身主要包含哪些内容,

public class Query {
    private static final String RESTRICTED_TYPES_KEY = "_$RESTRICTED_TYPES";private final Set<Class<?>> restrictedTypes = new HashSet();private final Map<String, CriteriaDefinition> criteria = new LinkedHashMap();private Field fieldSpec;private Sort sort;private int skip;private int limit;private String hint;private Meta meta = new Meta();

看一看主要是包含CriteriaDefinition,其次是fieldSpec,也就是要冲collection中的一行数据取出哪些字段。再次是sort,也就是安装什么字段进行排序,最后是skip和limit,也就是和分页相关的。

使用Hibernate的应该对Criteria非常熟悉。criteria可以完成基本的,等于,大于,等于大于,小于,小于等于,不等于,包含,in等最进本的查询比较操作。

例如,要比较时间大小,其中startDate和endDate都是Date类型,timestamp在mongo中储存的也是Date类型。 注意我的数据在collection中都是存储成Document.class, 也就是org.bson.Document类型

Query query = new Query();
Criteria criteria = Criteria.where("timestamp").gte(startDate).lte(endDate);
query.addCriteria(criteria);
query.with(new Sort(Sort.Direction.DESC, "timestamp"));List<Document> documentList = mongoTemplate.find(query, Document.class, collectionName);

我们Query 的排序和分页比较简单。如上面的例子所示Sort,当然我们需要调用long totalCount = mongoTemplate.count(query, Document.class, collectionName);获取该query总共可以查询多少,然后设置query.skip(start).limit(limit);再调用List documentList = mongoTemplate.find(query, Document.class, collectionName);获得本次要显示的内容。

效果图
这里写图片描述

  • BasicQuery

BasicQuery集成了Query,更加灵活了。

public class BasicQuery extends Query {
    private final DBObject queryObject;private DBObject fieldsObject;private DBObject sortObject;public BasicQuery(String query) {this((DBObject)JSON.parse(query));}

我们可以直接将json的查询字符串传递给BasicQuery, 例如{ “length” : { lt:210, l t : 210 , gt : 100}}。

 Query query = new BasicQuery(queryJsonStr);query.with(new Sort(Sort.Direction.DESC, "timestamp"));long totalCount = mongoTemplate.count(query, Document.class, collectionName);List<Document> documentList = mongoTemplate.find(query, Document.class, collectionName);

效果图
这里写图片描述

  • QueryBuilder

QueryBuilder有些类似于criteria,可以在其中比较各个字段,然后提交给BasicQuery。

         QueryBuilder queryBuilder = new QueryBuilder();//也是查询desc字段等于传入的desc变量并且conent字段等于传入的conent变量queryBuilder.and(new BasicDBObject("desc",desc), new BasicDBObject("content",content));Query query = new BasicQuery(queryBuilder.get());query.with(new Sort(Sort.Direction.DESC, "timestamp"));long totalCount = mongoTemplate.count(query, Document.class, collectionName);//查询时指定返回的需要的字段BasicDBObject fieldsObject = new BasicDBObject();fieldsObject.put("content", 1);fieldsObject.put("desc", 1);query = new BasicQuery(queryBuilder.get(),fieldsObject);List<Document> documentList = mongoTemplate.find(query, Document.class, collectionName);

截图
这里写图片描述

本博文的全部代码在这里,具体是springBootMongo工程的 MongoReadWriteController。 欢迎加星,下载

  相关解决方案