SpringBoot中Mongo查询条件是集合中的字段的处理

MongoRepository

MongoRepository和普通的Repository一样,继承PagingAndSortingRepository,支持分页和普通的CRUD。之前已经提过Jpa的一些基本操作,下面讲几个 稍微特殊点的。

List<Person> findByAddressZipCode(ZipCode zipCode);
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
List<Topic> findByAuthorName(String name);

这几个都是根据实体的属性(属性也是对象)进行的查询,譬如Topic类关联了Author,Author有个name属性,那么就可以用findByAuthorName(String name);这样的方式查询。上面的两个也是一样的道理,类似于hibernate的”from Person where address.zipCode = “。
需要注意的是,仅适应于多对一和一对一,也就是关联的这个实体只能是对象,不能是集合。譬如Person里有个Set

addresses属性,那就不能用上面的写法来查询了。
如果需要条件查询的字段是集合,那么该怎么办呢?
假如需要查询address.name=”朝阳区”的所有Person集合。在hibernate里是比较简单的,可以直接使用@Query(”from Person p inner join p.addresses as a where a.name = ‘朝阳区’”)这样的注解形式。这是hibernate特有的hql语法。那在mongo里是不能这么用的,要完成上面的查询,只依靠MongoRepository就不够用了,所以Spring同样也封装了MongoTemplate类,来完成mongo的操作,可定制性更高。

MongoTemplate

查询的话,主要工作就是用来完善org.springframework.data.mongodb.core.query.Criteria,Criteria是条件的集成,譬如上面的查询条件中对象是集合,可以用下面的方法

Criteria criteria = Criteria.where("addresses").elemMatch(Criteria.where("name").is("朝阳区"));
        Query query = new Query(criteria);

        return mongoTemplate.find(query, Person.class);

使用MongoTemplate可以完成对mongo的增删改查。
官方文档:http://docs.spring.io/spring-data/data-mongo/docs/current/reference/html/
下面是简写的例子:

mongoTemplate.findOne(new Query(Criteria.where("id").is(params.get("id"))), User.class,collectionName);    
List<User> result = mongoTemplate.find(new Query(Criteria.where("age").lt(params.get("maxAge"))), User.class,collectionName);  
//update
mongoTemplate.upsert(new Query(Criteria.where("id").is(params.get("id"))), new Update().set("name", params.get("name")), User.class,collectionName); 
//remove
mongoTemplate.remove(new Query(Criteria.where("id").is(params.get("id"))),User.class,collectionName);  

更多的内容可以看看这一篇:
http://blog.csdn.net/congcong68/article/details/44545253

你可能感兴趣的:(mongodb,mongo)