五.MongoDB入门-SpringData操作MongoDB

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB入门-SpringData操作MongoDB

MongoDB经典入门系列

在项目中我们更多的是使用Spring整合MongoDB进行开发,直接面向对象操作MongoDB的API即可,这里使用spring-boot-starter-data-mongodb

集成Mongodb

第一步:创建项目导入基础依赖,SpringBoot和Mongodb

 <parent>
     <groupId> org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.2.5.RELEASE</version>
</parent>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

第二步:创建启动类

@SpringBootApplication
public class MongoDemoApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(MongoDemoApplication.class, args);
    }
}

第三步:yml配置mongodb

spring:
  data:
    mongodb:
      uri: mongodb://testuser:testuser@127.0.0.1:27017/tempdb?authSource=admin&authMechanism=SCRAM-SHA-1

第四步:编写实体类,SpringData提供了@Document注解来标记文档对象 ,如下

@Document(collection = "students")    //集合名字
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
   

    @Id    //对应id , 字段名对应了mongo中的——id
    private String _id;

    //标记字段再mongo中的名字和类型
    @Field(name = "name",targetType = FieldType.STRING)
    private String name;

    @Field(name = "age" , targetType = FieldType.INT32)
    private Integer age;

    @Field(name = "sex" , targetType = FieldType.INT32)
    private Integer sex;

    private Teacher teacher;

}

第五步:编写repository接口,SpringData提供了MongoRepository接口,其中提供了基础的CRUD方法

@Repository
public interface TeacherMongoRepository extends MongoRepository<Student,String> {
   

}

解释:这里的泛型是标记了@Document的实体类,和id的类型

MongDB的CRUD

在SpringData中我们可以注入:MongoTemplate实现CRUD, 也可以使用刚才创建的 repository 。

实例:保存文档到Mongdb

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MongoDemoApplication.class)
class MongoDemoApplicationTests {
   

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private StudentMongoRepository repository;

     @Test
    public void saveTest() {
   
        List<Student> students = new ArrayList<>(50);
        for (int i = 0; i < 100; i++){
   
            Student student = new Student(i+"", i%2==0?"zs":"ls", i, i%3==0?1:0, null);
            students.add(student);
        }
        //mongoTemplate.insert(student);
        //mongoTemplate.save()

        //如果ID存在就会变成修改
        repository.saveAll(students);

        //不允许ID重复
        //repository.insert(students);
    }
}

实例:修改文档 , 可以使用repository.save或mongoTemplate.save方法修改,也可以使用mongoTemplate.updateFirst

@Test
public void updateTest() {
   
    //条件
    Query query = Query.query(Criteria.where("name").is("zs"));
    //修改的内容
    Update update = new Update().set("age", 18);
    //执行修改
    UpdateResult result = mongoTemplate.updateFirst(query, update, "students");
    //UpdateResult result = mongoTemplate.updateMulti(query, update, "students");
    System.out.println(result);
}

实例:根据ID删除 ,或根据条件删除

  • Query.query : 构建删除查询对象
  • Criteria.where : 构建具体条件
@Test
public void deleteTest() {
   
    //repository.deleteById("2");

    //根据条件删除,把name=zs的从students这个集合中删除掉
    Query query = Query.query(Criteria.where("name").is("zs"));
    DeleteResult result = mongoTemplate.remove(query, "students");
    System.out.println(result);
}

实例:根据ID查找 ,或查找所有

@Test
public void findTest() {
   
    Student findResult = repository.findById("2").get();
    System.out.println(findResult);

    //查找所有
    repository.findAll().forEach(student -> System.out.println(student));
}

实例:复杂查找

  • 使用 Query.query 构建query
  • 使用Criteria.where构建具体条件
  • query.with添加分页和排序
  • mongoTemplate.count查询条数
  • mongoTemplate.find 查找列表
@Test
    public void searchTest() {
   
        //repository.findAll().forEach(student -> System.out.println(student));

        //带条件查询,组合多个条件 ,带分页
        Query query = Query.query(Criteria.where("sex").is(1));
        //范围查询
        query.addCriteria(Criteria.where("age").gte(18));
        //正则查询
        query.addCriteria(Criteria.where("name").regex("zs"));
        //包含查询
        //query.addCriteria(Criteria.where("age").in(18,19));

        //and条件并列
        Criteria   criteria = Criteria.where("字段").is("值")
            .andOperator(Criteria.where("字段").is("值"), Criteria.where("字段").is("值"));
        //or 条件
        criteria = Criteria.where("字段").is("值")
            .orOperator(Criteria.where("字段").is("值"), Criteria.where("字段").is("值"));
        //取反
        criteria = Criteria.where("字段").is("值")
            .norOperator(Criteria.where("字段").is("值"), Criteria.where("字段").is("值"));

        //query.addCriteria(criteria);

        //查询条数
        long total = mongoTemplate.count(query, "students");

        System.out.println("总条数 = "+total);

        //分页翱翔
        //query.skip(跳过条数).limit(每页条数);
        //第3页 0开始, 每页10条
        query.with(PageRequest.of(0,10));
        //按照age倒排
        query.with(Sort.by(Sort.Order.desc("age")));

        //查询列表
        List<Student> students = mongoTemplate.find(query, Student.class);
        students.forEach(student -> System.out.println(student));
    }

聚合查询

  • 使用 mongoTemplate.aggregate 做聚合查询
  • 使用 Aggregation.match 构建匹配条件
  • Aggregation.group("name") 构建分组
@Test
public void testAgg(){
   

    //构建匹配条件
    MatchOperation matchOperation = Aggregation.match(Criteria.where("age").gt(50));

    //构建分组条件,按照age分组,统计条数
    GroupOperation groupOperation = Aggregation.group("name")
        //统计age总和
        .sum("age").as("totalAge")
        //统计条数
        .count().as("nums");

    //创建一个agg对象
    Aggregation aggregation = TypedAggregation.newAggregation(matchOperation,groupOperation);

    //执行聚合查询,一map返回结果
    AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "students", Map.class);

    Iterator<Map> iterator = results.iterator();

    while (iterator.hasNext()) {
   
        System.out.println(iterator.next());
    }
    //{_id=ls, totalAge=1875, nums=25}
    //{_id=zs, totalAge=1800, nums=24}
}
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
|
NoSQL MongoDB
MongoDB入门-sort和投影
这篇文章介绍了MongoDB中的排序(sort)和投影(projection)操作,通过示例代码展示了如何使用这些功能来控制查询结果的排序顺序和返回的字段。
38 3
MongoDB入门-sort和投影
|
3月前
|
NoSQL MongoDB
MongoDB入门-MongoDB的CURD语句练习
这篇文章提供了MongoDB的CURD操作的练习,涵盖了插入、查询、更新和删除数据的基本命令,并通过具体示例展示了如何在MongoDB中执行这些操作。
48 2
|
2月前
|
存储 NoSQL MongoDB
MongoDB入门级别教程全(Windows版,保姆级教程)
一份全面的MongoDB入门级教程,包括在Windows系统上安装MongoDB、使用MongoDB Shell和Compass GUI进行数据库操作,以及MongoDB的基本数据类型和查询技巧。
95 2
MongoDB入门级别教程全(Windows版,保姆级教程)
|
4月前
|
NoSQL BI 数据处理
【超实用攻略】MongoDB 聚合框架:从入门到精通,带你解锁数据处理新姿势!
【8月更文挑战第24天】MongoDB是一款以其灵活性和高性能闻名的NoSQL数据库。其强大的聚合框架采用管道式处理,允许用户定义多个数据处理阶段如过滤、分组等。本文通过示例数据库`orders`和`products`,演示如何利用聚合框架计算各产品的总销售额。示例代码展示了使用`$lookup`连接两集合、`$unwind`打平数组及`$group`按产品ID分组并计算总销售额的过程。这突显了聚合框架处理复杂查询的强大能力,是进行数据分析和报表生成的理想选择。
59 3
|
4月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
92 0
|
4月前
|
NoSQL Java 关系型数据库
MongoDB保姆级指南(下):无缝集成SpringData框架,一篇最全面的Java接入指南!
前面的两篇文章已经将MongoDB大多数知识进行了阐述,不过其中的所有内容,都基于原生的MongoDB语法在操作。可是,在实际的日常开发过程中,我们并不会直接去接触MongoDB,毕竟MongoDB只能算作是系统内的一个组件,无法仅依靠它来搭建出一整套系统。
207 1
|
5月前
|
DataWorks NoSQL fastjson
DataWorks操作报错合集之DataX进行MongoDB全量迁移的过程中,DataX的MongoDB Reader插件在初始化阶段找不到Fastjson 2.x版本的类库,该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
存储 NoSQL Linux
【MongoDB】下载安装、指令操作
【MongoDB】下载安装、指令操作
197 1
|
6月前
|
分布式计算 DataWorks NoSQL
DataWorks操作报错合集之从MongoDB同步数据到MaxCompute(ODPS)时,出现报错,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
DataWorks操作报错合集之从MongoDB同步数据到MaxCompute(ODPS)时,出现报错,该怎么解决
|
6月前
|
NoSQL Shell MongoDB
python操作MongoDB部分
python操作MongoDB部分
40 0