高效NoSQL数据库利器:Mongodb完整教程(二)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 高效NoSQL数据库利器:Mongodb完整教程(二)

4、navicat连接MongoDB

1、打开navicat

2、点击密码验证

3、填写相关信息

4、成功连接

5、MongoDB整合SpringBoot

5.1、环境准备

1、引入依赖

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

2.配置yml

spring:
  data:
    mongodb:
      uri: mongodb://root:root@101.34.254.161:27017/appdb?authSource=admin
      #uri等同于下面的配置
      #database: appdb
      #host: 101.34.254.161
      #port: 27017
      #username: root
      #password: root
      #authentication-database: admin

连接配置参考文档:https://docs.mongodb.com/manual/reference/connection-string/

3、在测试类注入mongoTemplate

@Autowired
MongoTemplate mongoTemplate;

5.2、集合操作

@Test
void contextLoads() {
    boolean exists = mongoTemplate.collectionExists("emp");
    // 删除集合
    if (exists) {
        mongoTemplate.dropCollection("emp");
    }
    // 创建集合
    mongoTemplate.createCollection("emp");
}

5.3、文档操作

相关注解

  • @Document
  • 修饰范围: 用在类上
  • 作用: 用来映射这个类的一个对象为mongo中一条文档数据
  • 属性:( value 、collection )用来指定操作的集合名称
  • @Id
  • 修饰范围:用在成员变量、方法上
  • 作用 : 用来将成员变量的值映射为文档_id值
  • @Field
  • 修饰范围: 用在成员变量、方法上
  • 作用:用来指定此成员变量不参与文档的序列化
  • @Transient
  • 修饰范围:用在成员变量、方法上
  • 作用:用来指定此成员变量不参与文档的序列化

创建实体

/**
 * 对应emp集合中的一个文档
 */
@Document("emp")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    /**
     * 映射文档中的_id
     */
    @Id
    private Integer id;
    @Field("username")
    private String name;
    @Field
    private int age;
    @Field
    private Double salary;
    @Field
    private Date birthday;
}

添加文档

insert方法返回值是新增的Document对象,里面包含了新增后id的值。如果集合不存在会自动创建集 合。通过Spring Data MongoDB还会给集合中多加一个class的属性,存储新增时Document对应Java中 类的全限定路径。这么做为了查询时能把Document转换为Java类型

添加一条记录:

@Test
void addDocTest(){
    Employee employee = new Employee(1,"小明",12,23.23,new Date());
    mongoTemplate.insert(employee);
}

查看数据库发现多了一个字段,是为了我们获取的时候可以装换为Java类型

批量添加

@Test
void addDocTest() {
    Employee employee = new Employee(1, "小明", 12, 23.23, new Date());
    mongoTemplate.insert(employee);
    // sava: _id存在时更新数据
    //mongoTemplate.save(employee);
    // insert: _id存在抛出异常 支持批量操作
    List<Employee> list = Arrays.asList(
        new Employee(2,"张三",15,232.0,new Date()),
        new Employee(3,"李四",35,122.0,new Date()),
        new Employee(4,"王五",45,232.0,new Date()),
        new Employee(5,"赵六",55,2432.0,new Date()),
        new Employee(6,"张七",75,232.0,new Date()),
        new Employee(7,"王八",65,2343.0,new Date())
    );
    mongoTemplate.insert(list,Employee.class);
}

5.4、查询文档

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

查询操作

@Test
void testSelect(){
    System.out.println("=====查询所有文档=====");
    //查询所有文档
    List<Employee> employeeList = mongoTemplate.findAll(Employee.class);
    employeeList.forEach(System.out::println);
    System.out.println("=====根据id查询=====");
    // 根据id查询
    Employee employee = mongoTemplate.findById(1, Employee.class);
    System.out.println(employee);
    System.out.println("=====findOne返回第一个文档=====");
    // 返回第一个文档
    Employee one = mongoTemplate.findOne(new Query(), Employee.class);
    System.out.println(one);
    System.out.println("=====条件查询=====");
    // new Query()表示没有条件
    // 查询年龄大于等于12的员工
    mongoTemplate.find(new Query(Criteria.where("age").gte(12)),Employee.class).forEach(System.out::println);
    // 查询年龄大于12小于50的员工
    new Query(Criteria.where("age").gt(12).lt(50));
    // 正则查询(模糊查询) java中正则不需要有//
    new Query(Criteria.where("name").regex("张"));
    // and or 多条件查询
    // and 查询年龄大于25且姓名包含张的员工
    Criteria criteria = new Criteria();
    new Query(criteria.andOperator(Criteria.where("age").gt(25),Criteria.where("name").regex("张")));
    // or
    new Query(criteria.orOperator(Criteria.where("age").gt(25),Criteria.where("name").regex("张")));
    // sort排序
    new Query().with(Sort.by(Sort.Order.desc("age")));
    // skip limit分页
    new Query().with(Sort.by(Sort.Order.desc("salary")))
        // 跳过记录数
        .skip(0)
        // 显示记录数
        .limit(4);
}
@Test
void testJson() {
    // 使用json字符串方式查询
    // 等值查询
    // String json = "{name:'张三'}";
    // 多条件查询
    String json = "{$or:[{age:{$gt:25}},{salary:{$gte:13}}]}";
    Query query = new BasicQuery(json);
    // 结果
    mongoTemplate.find(query,Employee.class).forEach(System.out::println);
}

5.5、更新文档

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

  • updateFirst() 只更新满足条件的第一条记录
  • updateMulti() 更新所有满足条件的记录
  • upsert() 没有符合条件的记录则插入数据
@Test
void testUpdate(){
    // query设置查询条件
    Query query = new Query(Criteria.where("age").gte(23));
    System.out.println("======更新前======");
    mongoTemplate.find(query,Employee.class).forEach(System.out::println);
    Update update = new Update();
    // 设置更新属性
    update.set("age",23);
    // updateFirst()只更新满足条件的第一条记录
    // UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Employee.class);
    // updateMulti()更新所有满足
    // UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Employee.class);
    //upsert()没有符合条件的记录则插入数据
    //update.setOnInsert("id",11); // 如果是插入的话则指定id
    UpdateResult updateResult = mongoTemplate.upsert(query, update,
                                                     Employee.class);
    // 返回修改的记录数
    System.out.println(updateResult.getModifiedCount());
    System.out.println("======更新后======");
    mongoTemplate.find(query,Employee.class).forEach(System.out::println);
}

5.6、删除文档

/**
     * 删除文档
     */
@Test
public void testDelete() {
    //删除所有文档
    //mongoTemplate.remove(new Query(),Employee.class);
    //条件删除
    Query query = new Query(Criteria.where("salary").gte(10000));
    mongoTemplate.remove(query, Employee.class);
}

相关实践学习
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
目录
相关文章
|
6天前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
32 15
|
14天前
|
存储 NoSQL 关系型数据库
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
28天前
|
存储 机器学习/深度学习 监控
南大通用GBase 8s数据库onbar基础使用教程
数据备份与恢复是确保数据安全和业务连续性的关键。onbar作为GBase 8s数据库的备份工具,需配合存储管理器使用,通过配置BAR_BSALIB_PATH等参数,实现数据的备份与恢复。本文详细介绍了onbar的配置、备份、恢复及监控流程,帮助数据库管理员构建高效的数据保护方案。
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
3月前
|
存储 NoSQL 关系型数据库
非关系型数据库-MongoDB技术(二)
非关系型数据库-MongoDB技术(二)
|
3月前
|
NoSQL 关系型数据库 MongoDB
非关系型数据库-MongoDB技术(一)
非关系型数据库-MongoDB技术(一)
|
2月前
|
存储 NoSQL MongoDB
MongoDB 数据库引用
10月更文挑战第20天
24 1
|
2月前
|
存储 NoSQL Shell
MongoDB 创建数据库
10月更文挑战第12天
90 4