一,简介
Mongodb是为快速开发互联网Web应用而构建的数据库系统,其数据模型和持久化策略就是为了构建高读/写吞吐量和高自动灾备伸缩性的系统,Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。
二,MongoDB来访问mongodb数据库的几种方法
使用Query和Criteria类
JPA自动生成的查询方法
使用@Query 注解基于JSON查询
三,引入依赖
3.1
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
3.2 修改application.yml配置
mongodb:
host: localhost # mongodb的连接地址
port: 27017 # mongodb的连接端口号
database: mall-port # mongodb的连接的数据库
四,文档查询
使用Spring Data来查询MongoDB的最常用方法之一是使用Query和Criteria类 , 它们非常接近本地操作符。
4.1 is查询
示例:查找名为Eric的用户。
[
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581908"),
"_class" : "org.baeldung.model.User",
"name" : "Antony",
"age" : 55
}
}]
查询代码:
Query query = new Query();
query.addCriteria(Criteria.where("name").is("Eric"));
List<User> users = mongoTemplate.find(query, User.class);
返回数据:
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
}
4.2 正则查询
正则表达式是一个更灵活和强大的查询类型。这使用了一个使用MongoDB $ regex的标准,该标准返回适用于这个字段的这个正则表达式的所有记录。
它的作用类似于startingWith,endingWith操作 - 让我们来看一个例子。
示例:查找名称以A开头的所有用户,这是数据库的状态:
[
{
"_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
}
]
查询语句:
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("^A"));
List<User> users = mongoTemplate.find(query,User.class);
返回结果:
[
{
"_id" : ObjectId("55c0e5e5511f0a164a581908"),
"_class" : "org.baeldung.model.User",
"name" : "Antony",
"age" : 33
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581909"),
"_class" : "org.baeldung.model.User",
"name" : "Alice",
"age" : 35
}
]
示例:查找名称以c结尾的所有用户:
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("c$"));
List<User> users = mongoTemplate.find(query, User.class);
返回结果:
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
}
4.3 LT和GT
gt(大于)。
示例:查找年龄在20岁到50岁之间的所有用户
数据库是:
[
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581908"),
"_class" : "org.baeldung.model.User",
"name" : "Antony",
"age" : 55
}
}
查询语句:
Query query = new Query();
query.addCriteria(Criteria.where("age").lt(50).gt(20));
List<User> users = mongoTemplate.find(query,User.class);
返回结果:
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
}
4.4 结果排序
Sort用于指定结果的排序顺序。
原始数据:
[
{
"_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
}
]
构造排序查询:
Query query = new Query();
query.with(new Sort(Sort.Direction.ASC, "age"));
List<User> users = mongoTemplate.find(query,User.class);
查询结果:
[
{
"_id" : ObjectId("55c0e5e5511f0a164a581908"),
"_class" : "org.baeldung.model.User",
"name" : "Antony",
"age" : 33
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581909"),
"_class" : "org.baeldung.model.User",
"name" : "Alice",
"age" : 35
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
}
]
4.5 分页
数据库数据:
[
{
"_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的页面
final Pageable pageableRequest = new PageRequest(0, 2);
Query query = new Query();
query.with(pageableRequest);
查询结果:
[
{
"_id" : ObjectId("55c0e5e5511f0a164a581907"),
"_class" : "org.baeldung.model.User",
"name" : "Eric",
"age" : 45
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581908"),
"_class" : "org.baeldung.model.User",
"name" : "Antony",
"age" : 33
}
]
五,生成的查询方法(Generated Query Methods)
生成查询方法是JPA的一个特性,在Spring Data Mongodb里也可以使用,要做到2里功能,只需要在接口上声明方法即可。
public interface UserRepository
extends MongoRepository<User, String>, QueryDslPredicateExecutor<User> {
...
}
5.1 FindByX
我们将通过探索findBy类型的查询来简单地开始 - 在这种情况下,通过名称查找:
List<User> findByName(String name);
与4.1 - 查询将具有相同的结果,查找具有给定名称的所有用户:
List<User> users = userRepository.findByName("Eric");
5.2 StartingWith and endingWith
简单示例:
List<User> findByNameStartingWith(String regexp);
List<User> findByNameEndingWith(String regexp);
具体示例:
List<User> users = userRepository.findByNameStartingWith("A");
List<User> users = userRepository.findByNameEndingWith("c");
结果是完全一样的。
5.3 Between
类似于4.3,这将返回年龄在ageGT和ageLT之间的所有用户:
List<User> findByAgeBetween(int ageGT, int ageLT);
List<User> users = userRepository.findByAgeBetween(20, 50);
5.4 Like和OrderBy
示例:为生成的查询组合两种类型的修饰符,我们将要查找名称中包含字母A的所有用户,我们也将按年龄顺序排列结果
List<User> users = userRepository.findByNameLikeOrderByAgeAsc("A");
返回结果:
[
{
"_id" : ObjectId("55c0e5e5511f0a164a581908"),
"_class" : "org.baeldung.model.User",
"name" : "Antony",
"age" : 33
},
{
"_id" : ObjectId("55c0e5e5511f0a164a581909"),
"_class" : "org.baeldung.model.User",
"name" : "Alice",
"age" : 35
}
]
六,JSON查询方法
如果我们无法用方法名称或条件来表示查询,那么我们可以做更低层次的事情 - 使用@Query注解。
通过这个注解,我们可以指定一个原始查询 - 作为一个Mongo JSON查询字符串。
6.1 FindBy
示例:
@Query("{ 'name' : ?0 }")
List<User> findUsersByName(String name);
这个方法应该按名称返回用户 - 占位符?0引用方法的第一个参数。
6.2 regex: ?0 } }")
List<User> findUsersByRegexpName(String regexp);
用法:
List<User> users = userRepository.findUsersByRegexpName("^A");
List<User> users = userRepository.findUsersByRegexpName("c$");
6.3 gt
示例:
@Query("{ 'age' : { lt: ?1 } }")
List<User> findUsersByAgeBetween(int ageGT, int ageLT);
注意:如果使用JPA实现的查询,在接口中直接指定查询方法名称便可查询,无需进行实现。
参考文档:https://www.baeldung.com/queries-in-spring-data-mongodb
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247483728&idx=1&sn=5fb894f603df69ba96b225899d3faf71&scene=21#wechat_redirect