MongoDB介绍&使用

MongoDB介绍

1.什么是MongoDB?

MongoDB是一个基于分布式文件存储的开源数据库系统。是一个基于文档的数据库,其中文档是指一组键值对(类似于关系型数据库中的一行记录),其中值可以是字符串、整数、数组、嵌套文档等各种数据类型。MongoDB中的文档可以是动态的,即不需要提前定义文档的结构。MongoDB将文档组织为集合(类似于关系型数据库中的表),集合中的文档可以根据需要进行添加、删除、更新和查询等操作。

2.MongoDB的特点

1)高度可扩展:MongoDB是一种分布式数据库,可以轻松地将数据分布到多个节点上,从而实现数据的高可用和负载均衡。MongoDB还支持水平扩展,即在需要时可以添加更多的节点来扩展数据存储和处理能力。

2)灵活的数据模型:MongoDB的文档是基于BSON(二进制JSON)格式存储的,因此可以支持各种数据类型和数据结构。MongoDB还支持嵌套文档和数组,从而实现更复杂的数据结构和查询。

3)高性能:MongoDB使用内存映射文件(MMAP)来管理数据存储和读写,从而实现高效的数据访问和查询。MongoDB还支持索引和聚合操作,可以更快速地处理大量数据。

4)多样化的查询:MongoDB支持各种类型的查询,包括范围查询、文本搜索、地理位置查询等,从而满足不同应用场景下的数据需求。

5)容易学习和使用:MongoDB的语法简单、直观,可以通过命令行工具、图形界面或各种语言的驱动程序进行操作。

3.使用Docker安装MongoDB

1)拉取MongoDB镜像

默认会拉取最新的镜像

dokcer pull mongo

查看镜像

docker images

2) 创建MongoDB容器

docker run -dit --name mongo -p 27017:27017 mongo:latest --auth

参数说明:

  • -i:表示运行容器
  • -t:表示容器启动后进入其命令行
  • -d:守护式方式创建容器在后台运行
  • -name:容器名称
  • -p 27017:27017:端口映射(宿主机端口:容器端口),mongoDB默认是27017端口
  • –auth:访问mongo需要鉴权(账号密码访问),这个参数要放在最后面,否则会报错

3)进入容器并访问mongoDB

#MongoDB6.0及以上使用:

docker exec -it mongo /bin/mongosh

#MongoDB6.0以下的版本使用:

docker exec -it mongo /bin/mongo

4)创建用户并查看

#创建账号

db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'test'},"readWriteAnyDatabase"]});

#验证用户

db.auth("admin","123456")

#使用账号密码登录数据库(先退出容器,重新进入)

docker exec -it mongo /bin/bash
mongosh -u admin -p 123456 

#查看用户(切换到admin查看用户)

use admin

show users

5)查看数据库

show dbs

MongoDB使用

1. pom文件添加MongoDB依赖

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

2.配置文件添加配置

spring:
  data:
    mongodb:

     #无密码
     uri: mongodb://服务器IP:端口/数据库名
      #有密码——mongodb://用户名:密码@服务器IP:端口/数据库名

3.创建实体类

实体类上添加*@Document(“集合/表名”)* ,id属性由于Mongodb会生成24位的字符串需要设置为String类型且需要添加注解*@Id*

4.具体使用

1)方式一、MongoTemplate

MongoTemplate是数据库和代码之间的接口,它提供了很多操作MongoDB的方法。 它是线程安全的,可以在多线程的情况下使用。
MongoTemplate的两大核心类:

  • Criteria类:封装所有的语句,以方法的形式查询。
  • Query类:将语句进行封装或者添加排序之类的操作。
//注入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
//添加
@Test
void create() {
    User user=new User();
    user.setName("xiaodeng");
    user.setAge(21);
    user.setEmail("123@123.com");
    User u = mongoTemplate.insert(user);
    System.out.println(u);
}

//查询所有
@Test
void find(){
    List<User> users = mongoTemplate.findAll(User.class);
    for (User user : users) {
        System.out.println(user);
    }
}

//通过id查询
@Test
void findById(){
    User user = mongoTemplate.findById("627120bf48f3efd7bcb4348b", User.class);
    System.out.println(user);
}

//条件组合查询
@Test
void findByCondition(){
    /**
     * name = xiaodeng and age = 21 组合查询
     */
    Query query=new Query(
            Criteria.where("name").is("xiaodeng").and("age").is(21)
    );
    List<User> users = mongoTemplate.find(query, User.class);
    for (User user : users) {
        System.out.println(user);
    }
}

//模糊查询
@Test
void findLikeUser(){
    /**
     * name like deng
     */
    String name="deng";
    //正则规则
    String regex=String.format("%s%s%s","^.*",name,".*$");
    //正则表达式
    Pattern pattern= Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
    //创建条件构造器
    Query query=new Query(
            Criteria.where("name").regex(pattern)
    );
    List<User> users = mongoTemplate.find(query, User.class);
    for (User user : users) {
        System.out.println(user);
    }
}

//分页查询
@Test
void findByPage(){
    Integer pageNum=1;
    Integer pageSize=2;
    Query query=new Query();
    //查询记录数 query必须填写可以不构建条件,但不能类似mp直接写null
    long count = mongoTemplate.count(query, User.class);
    //分页  skip为跳过这几条数据意味着开始位置,limit为每页的数据量
    List<User> users = mongoTemplate.find(query.skip((pageNum - 1) *
            pageSize).limit(pageSize), User.class);
    for (User user : users) {
        System.out.println(user);
    }
    System.out.println(count);
}

//修改
@Test
void update(){
    Query query=new Query(
            Criteria.where("_id").is("6271223648f3efd7bcb4348c")
    );
    Update update=new Update();
    update.set("name","xiaozuo");
    update.set("age",22);
    update.set("email","123@123.com");
    UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
    long matchedCount = upsert.getMatchedCount();//影响行数
    System.out.println(upsert);
}

//删除
@Test
void delete(){
    Query query=new Query(
            Criteria.where("_id").is("6271223648f3efd7bcb4348c")
    );
    DeleteResult remove = mongoTemplate.remove(query, User.class);
    long deletedCount = remove.getDeletedCount();//影响行数
    System.out.println(deletedCount);//1 成功 0 失败
}
2)方式二、MongoRepository

创建数据访问层

#第一个参数为实体类型,第二个为主键Id类型

public interface UserRepository extends MongoRepository<Person, String> { }

在业务层或测试类中注入UserRepository

//多条件查询
@Test
void findByCondition(){
    /**
     * 关于Example 示例查询
     */
    User u=new User();
    u.setName("xiaolu");
    u.setAge(21);
    Example<User> userExample =Example.of(u);
    System.out.println(userExample);
    List<User> users = userRepository.findAll(userExample);
    System.out.println(users);
}
//模糊查询
@Test
void findLikeUser(){
    ExampleMatcher exampleMatcher=ExampleMatcher.matching()
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//设置字符串模糊查询规则
            .withIgnoreCase(true);//设置忽略大小写
    User u=new User();
    u.setName("lu");
    u.setEmail("123");
    Example<User> userExample = Example.of(u, exampleMatcher);
    List<User> users = userRepository.findAll(userExample);
    System.out.println(users);
}
//分页查询
@Test
void findByPage(){
    /**
     *  设置分页查询 可设置当前页数、每页条数,也可设置指定的Sort排序规则等
     *  注意:该当前页从0开始
     */
    Pageable pageable = PageRequest.of(1, 3);
    User u=new User();
    Example<User> userExample = Example.of(u);
    Page<User> userPage = userRepository.findAll(userExample, pageable);
    System.out.println(userPage);
    System.out.println(userPage.getContent());
    System.out.println(userPage.getTotalPages());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值