首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库MongoDB-Spring Data Mongod

数据库MongoDB-Spring Data Mongod

作者头像
cwl_java
发布2021-02-04 11:07:01
1.5K0
发布2021-02-04 11:07:01
举报
文章被收录于专栏:cwl_Javacwl_Java

Spring Data Mongodb

使用Spring Data 框架都是按照面向对象思想操作用于的工具。

使用Spring Data Mongodb 也是使用面向对象的方式进行操作MongoDB,省略了使用Mongodb的Java客户端API把Document转换为实体类的过程

搭建项目环境

创建项目

创建项目

修改POM文件添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

修改配置文件

spring:
data:
mongodb:
database: bjsxt
host: 192.168.8.133
username: smallming
password: smallming
port:27017
authentication-database: admin

MongoTemplate的使用

创建实体

  • @Document 参数表示操作的集合名称,如果没有@Document表示操作的集合名为实体类名首字母变小写(由大驼峰变成小驼峰)。
  • @Id 标识主键。当主键叫做_id或id时可以省略此属性

@Field 放在普通属性上,如果希望对属性改名或其他限制需要此注解。可以省略,表示实体类属性名为Mongodb集合中field名称

@Document(“collection1”)
public classPeople {
@Id
privateStringid;
privateStringname;
private int****age;

publicString getId() {
return****id;
}

public voidsetId(String id) {
this.id= id;
}

publicString getName() {
return****name;
}

public voidsetName(String name) {
this.name= name;
}

public intgetAge() {
return****age;
}

public voidsetAge(intage) {
this.age= age;
}

@Override
publicString toString() {
return**“People{”+
“id=’”+id+‘’’+
", name=’"+name+‘’’+
", age="+age+
’}’**;
}
}

添加文档

insert方法返回值是新增的Document对象,里面包含了新增后_id的值。

如果集合不存在会自动创建集合。通过Spring Data MongoDB还会给集合中多加一个_class的属性,存储新增时Document对应Java中类的全限定路径。这么做为了查询时能把Document转换为Java中类类型。

@Test
public voidinsert() {
People people =newPeople();
people.setAge(12);
people.setName(“测试名字”);
People people =mongoTemplate.insert(people);
}

修改文档

在Mongodb中无论是使用客户端API还是使用Spring Data,更新返回结果一定是受影响行数。如果更新后的结果和更新前的结果是相同,返回0。

如果使用对象方式进行修改(save方法)必须要保证对象中所有属性都是有值得,否则只能使用update方法

使用save修改

使用save时,如果主键值已经存在,则表示修改操作。

voidcontextLoads() {
HousePojo hp =newHousePojo();
hp.setId(“5e478e0c41b522522ab11099”);
hp.setArea(129.0);
hp.setHno(“x003”);
hp.setTime(newDate());
hp.setType(“三室一厅”);
// 重点是返回的结果带有主键_id
**HousePojo hpResult =mongoTemplate.save(hp);
System.out.println(hpResult);
}
使用特定运算符进行更新

底层使用mongodb更新运算符完成。

Update的set方法底层就是$set.可以通过set方法更新特定的属性值。

有两个更新方法:

updateFirst()只更新满足条件的第一个值

updateMulti() 更新所有满足条件的值

updateFirst

使用Update设置修改结果时,注意update.set()函数第一个参数的类型。如果name是字符串取值张三要有双引号。如果set方法第一个参数是age,第二个参数要没有双引号。

//设置查询体,查询条件具体内容
Criteria criteria = Criteria.where(“name”).is(“张三”*);
// query设置查询条件*
Query query =newQuery(criteria);
*//设置修改哪些属性
Update update =newUpdate();
update.set(“name”,“张三”);
*// People.class告诉Spring Data MognoDB上面的属性是哪个类。
//类对应集合,就知道具体操作集合的哪个属性
UpdateResult result =mongoTemplate.updateFirst(query, update, People.class);
//修改数量,如果修改前和修改后相同,返回0
System.out.println(result.getModifiedCount());
*//匹配数量。最多返回1,即使有多个张三返回也是1**.*
System.out.println(result.getMatchedCount());
updateMulti
//设置查询体,查询条件具体内容
Criteria criteria = Criteria.where(“name”).is(“张三”*);
// query设置查询条件*
Query query =newQuery(criteria);
*//设置修改哪些属性
Update update =newUpdate();
update.set(“age”,18);
*// People.class告诉Spring Data MognoDB*上面的属性是哪个类。
//*类对应集合,就知道具体操作集合的哪个属性
UpdateResult result =mongoTemplate.updateMulti(query, update, People.class);
//*修改数量。返回所有匹配结果中真实被修改数量
System.out.println(result.getModifiedCount());
//*匹配数量
System.out.println(result.getMatchedCount());

删除

根据主键删除

使用remove(Object)实现根据主键进行删除。

只判断对象的主键,其他属性是否有值没有影响。但是主键必须不能是null的。

People peo =newPeople();
peo.setId(“5e83fe26a7641113b6a4d71d”);
peo.setName(“随意”);
DeleteResult result =mongoTemplate.remove(peo);
System.out.println(result.getDeletedCount());
根据条件进行删除

只要是Spring Data MongoDB中涉及到条件都提供了两种方式,一种根据POJO中属性名进行匹配,另一种是根据集合中属性名进行匹配。

修改POJO

此处特意把属性name配置@Field设置MongoDB集合中属性名称为username。

@Data
@NoArgsConstructor
@AllArgsConstructor
public classPeople {
//主键可以叫做id也能映射上_id
**privateStringid;
@Field(“username”)
privateStringname;
privateIntegerage;
privateStringaddress;
}
通过实体类属性名设置条件

里面where方法参数name是People类的属性名。

remove方法第二个参数是类类型。

Query query =newQuery(Criteria.where(“name”).is(“张三”));
//第二个参数告诉Spring Data Mongodb**,name属性对应的类类型。
DeleteResult result =mongoTemplate.remove(query, People.class);
System.out.println(result.getDeletedCount());

通过集合属性名设置条件

其中where方法参数username是集合people的属性名

remove第二个参数是MongoDB中集合名称。

Query query =newQuery(Criteria.where(“username”).is(“张三”));
//第二个参数告诉Spring Data Mongodb**,name属性对应的类类型。
DeleteResult result =mongoTemplate.remove(query,“people”);
System.out.println(result.getDeletedCount());

查询文档

Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法标准和查询连接起来,方便我们操作查询语句。

例如: 查询条件username=“smallming”

mongoTemplate.find (new Query(Criteria.where("username").is("smallming")))
  • 1

多个条件组合查询时:

例如:username=“smallming” and userage=“20”

mongoTemplate.find(new Query(Criteria.where("username").is("smallming").and("userage").is("20")))
  • 1

例如:username=“smallming” or userage=“20”

mongoTemplate.findOne(new Query(new Criteria().orOperator(Criteria.where("username").is("smallming"),Criteria.where("userage").is("20"))));
  • 1
在这里插入图片描述
在这里插入图片描述

查询全部文档

@Test
public voidselect() {
List list =mongoTemplate.findAll(People.class);
System.out.println(list);
}

查询单个对象

如果查询结果是多个,返回其中第一个文档对象

@Test
voidselectOne(){
// 获取到结果中第一条数据
// new Query() 表示没有条件
**People people =mongoTemplate.findOne(newQuery(), People.class);
System.out.println(people);
}

带有条件的查询多个

注意: 带有条件的查询多个时,使用find()方法

@Test
voidfind(){
Query query =newQuery(Criteria.where(“age”).gte(3));
List list =mongoTemplate.find(query, People.class);
System.out.println(list);
}

根据主键进行查询

@Test
voidfindById(){
People peo =mongoTemplate.findById(“5e84317c2b937833016218bf”, People.class);
System.out.println(peo);
}

根据字段是否为空进行查询

@Test
voidexists(){
Query query =newQuery(Criteria.where(“age”).exists(true));
List list =mongoTemplate.find(query, People.class);
System.out.println(list);
}

根据大于并且小于查询

Criteria所有方法的返回值都是当前类对象,所以支持连缀写法。

@Test
voidrange(){
Query query =newQuery(Criteria.where(“age”).gte(1).lte(19));
List list =mongoTemplate.find(query, People.class);
System.out.println(list);
}

根据正则查询(模糊查询)

@Test
voidregex() {
// java中正则不需要有//
Query query =newQuery(Criteria.where(“name”).regex(“张”**));
List list =mongoTemplate.find(query, People.class);
System.out.println(list);
}

查询去重复结果

findDistinct() 参数说明:

第一个参数: 查询条件query

第二个参数: 根据哪个属性去重复。是POJO的属性名称。返回值为此属性去重后的集合。

第三个参数: 属性所在实体类。

第四个参数: 属性的类型,此类型作为结果中List集合的泛型。

@Test
voidfindDistinct(){
List list =mongoTemplate.findDistinct(newQuery(),“name”, People.class, String.class);
System.out.println(list);
}

多条件查询

and
@Test
voidand(){
Criteria c =newCriteria();
c.andOperator(Criteria.where(“name”).is(“张三”),Criteria.where(“age”).is(18));
Query query =newQuery©;
List list =mongoTemplate.find(query, People.class);
System.out.println(list);
}
Or

查询姓名为张三或者年龄是998岁的用户

@Test
voidor(){
Criteria c =newCriteria();
c.orOperator(Criteria.where(“name”).is(“张三”),Criteria.where(“age”).is(998));
List list =mongoTemplate.find(newQuery©, People.class);
System.out.println(list);
}
混合应用

查询姓名为张三并且年龄为18岁或者姓名为李四年龄为20的用户

@Test
voidorAnd(){

Criteria and1 =newCriteria();
and1.andOperator(Criteria.where(“name”).is(“张三”),Criteria.where(“age”).is(18));
Criteria and2 =newCriteria();
and2.andOperator(Criteria.where(“name”).is(“李四”),Criteria.where(“age”).is(20));

Criteria c =newCriteria();
c.orOperator(and1,and2);

List list =mongoTemplate.find(newQuery©, People.class);
System.out.println(list);
}

结果排序

Sort只有私有构造,但是提供给了静态的by方法

Direction是Sort内部枚举。

age按照那个属性进行排序。属性一定是find方法第二个参数类中的属性。

@Test
voidsort(){
Query query =newQuery(Criteria.where(“age”).gte(2));
query.with(Sort.by(Sort.Direction.DESC,“age”));
List list =mongoTemplate.find(query, People.class);
System.out.println(list);
}

分页查询

PageRequest是Pageable接口的实现类。里面有protected的构造方法和名称为of的静态方法。

PageRequest.of(page,size)

PageRequest.of(page,size,Sort) 先排序后分页

PageRequest.of(page,size,Direction,properties) 排序后分页

page表示第几页,0表示第一页

size表示一页显示几个

@Test
voidpage(){
Query query =newQuery();
// query.with(PageRequest.of(0,2));
query.with(PageRequest.of(0,2, Sort.Direction.DESC,“age”**));
List list =mongoTemplate.find(query, People.class);
System.out.println(list);
}

聚合操作

查询文档总数

Aggregation.group(String …)设置分组条件,如果没有分组,参数省略。

count() 取总条数

as() 给查询出来的总条数起别名

aggregate() 执行聚合命令,第二个参数Map表示返回结果放入到Map中。

result.getUniqueMappedResult() 获取到返回结果。

@Test
voidaggregate(){
TypedAggregation aggregation = TypedAggregation.newAggregation(People.class, Aggregation.group().count().as(“count”));
AggregationResults result =mongoTemplate.aggregate(aggregation, Map.class);
System.out.println(result.getUniqueMappedResult());
System.out.println(result.getUniqueMappedResult().get(“count”));
}
分组计算每组总数

此处要求group()参数必须是在People类中存在。

设置group参数,表示按照哪个属性进行分组。

getMappedResults() 当执行聚合函数返回结果为多行时使用此方法。

@Test
voidaggregate(){
TypedAggregation aggregation = TypedAggregation.newAggregation(People.class, Aggregation.group(“name”).count().as(“count”));
AggregationResults result =mongoTemplate.aggregate(aggregation, Map.class);
List list = result.getMappedResults();
for(Map map : list){
System.out.println(map.get(“count”)+"—"+map.get("_id"));
}
}
带有查询条件的分组计算

Aggregation.match写在group前面表示先过滤条件在分组。写在后面表示先分组在过滤条件

@Test
voidaggregate(){
TypedAggregation aggregation = TypedAggregation.newAggregation(People.class,Aggregation.match(Criteria.where(“name”).is(“张三”)), Aggregation.group(“name”).count().as(“count”));
AggregationResults result =mongoTemplate.aggregate(aggregation, Map.class);
List list = result.getMappedResults();
for(Map map : list){
System.out.println(map.get(“count”)+"—"+map.get("_id"));
}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Data Mongodb
    • 搭建项目环境
      • 创建项目
      • 修改POM文件添加依赖
      • 修改配置文件
    • MongoTemplate的使用
      • 创建实体
      • 添加文档
      • 修改文档
      • 删除
      • 通过集合属性名设置条件
    • 查询文档
      • 查询全部文档
      • 查询单个对象
      • 带有条件的查询多个
      • 根据主键进行查询
      • 根据字段是否为空进行查询
      • 根据大于并且小于查询
      • 根据正则查询(模糊查询)
      • 查询去重复结果
      • 多条件查询
      • 结果排序
      • 分页查询
      • 聚合操作
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档