转自: http://www.baeldung.com/queries-in-spring-data-mongodb
1.概述
本文将着重于在
Spring Data MongoDB
中构建不同类型的查询。我们将查询使用
Query
和Criteria
类,自动生成的查询方法
,JSON查询
和QueryDSL
查询文档。
1.1 Maven的依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.6.RELEASE</version>
</dependency>
2.Documents Query
使用Spring Data查询MongoDB的更常用方法之一是使用Query和Criteria类 - 它们非常接近本地操作符。下面是示例数据↓↓↓
[
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581908"),
"_class" : "org.baeldung.model.User",
"name" : "Antony",
"age" : 33
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581909"),
"_class" : "org.baeldung.model.User",
"name" : "Alice",
"age" : 35
}
]
2.1 Is
现在让我们看看查询代码:
Query query = new Query();
query.addCriteria(Criteria.where("name").is("Eric"));
List<User> users = mongoTemplate.find(query, User.class);
2.2 regex 正则表达式
现在让我们创建查询:在正在查找名称以A开头
的所有用户。
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("^A"));
List<User> users = mongoTemplate.find(query,User.class);
这里是另一个简单的例子,这次查找名称以c结尾
的所有用户:
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("c$"));
List<User> users = mongoTemplate.find(query, User.class);
Lt和gt 小于和大于
我们正在寻找年龄在20到50之间
的所有用户:
Query query = new Query();
query.addCriteria(Criteria.where("age").lt(50).gt(20));
List<User> users = mongoTemplate.find(query,User.class);
2.4 sort 排序
返回按年龄升序
排列的所有用户:
Query query = new Query();
query.with(new Sort(Sort.Direction.ASC, "age"));
List<User> users = mongoTemplate.find(query,User.class);
2.5 分页
final Pageable pageableRequest = new PageRequest(0, 2);
Query query = new Query();
query.with(pageableRequest);
List<User> users = mongoTemplate.find(query,User.class);
3 Mongo JSON查询方法 - 使用@Query注释。
3.1 FindBy
让我们先从简单的,看看一个通过查找类型的方法
:
@Query("{ 'name' : ?0 }")
List<User> findUsersByName(String name);
此方法应该按名称返回用户 - 占位符?0 引用该方法的第一个参数。
List<User> users = userRepository.findUsersByName("Eric");
3.2 $regex 正则表达式
正则表达式驱动的查询
@Query("{ 'name' : { $regex: ?0 } }")
List<User> findUsersByRegexpName(String regexp);
用法也完全一样:
List<User> users = userRepository.findUsersByRegexpName("^A");
List<User> users = userRepository.findUsersByRegexpName("c$");
3.3 $lt 和 $gt
@Query("{ 'age' : { $gt: ?0, $lt: ?1 } }")
List<User> findUsersByAgeBetween(int ageGT, int ageLT);
原始查询中的索引来引用每个参数:?0和?1。
List<User> users = userRepository.findUsersByAgeBetween(20, 50);