springboot整合spring data mogodb

一,简介
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
lt(小于)运算符和 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 示例:这是一个正则表达式驱动的查询 - 会产生与4.2和5.2相同的结果: @Query("{ 'name' : {regex: ?0 } }")
List<User> findUsersByRegexpName(String regexp);

用法:
List<User> users = userRepository.findUsersByRegexpName("^A");
List<User> users = userRepository.findUsersByRegexpName("c$");

6.3 lt和 gt
示例:
@Query("{ 'age' : { gt: ?0,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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容