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