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

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” : { 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。 欢迎加星,下载

猜你喜欢

转载自blog.csdn.net/russle/article/details/80373560