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” : {<nobr aria-hidden="true">lt:210,</nobr>
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。 欢迎加星,下载
网友评论