验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

docker安装mongoDB及使用方法是什么

阅读:806 来源:乙速云 作者:代码code

docker安装mongoDB及使用方法是什么

      一、mongoDB是什么?

      MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写。

      1. mongo的体系结构

      docker安装mongoDB及使用方法是什么

      • mongo中的集合相当于mysql中表的概念;

      • mongo中的文档相当于mysql中行的概念;

      • mongo中的域相当于mysql中字段/列的概念;

      2. mongoDB的特点(或使用场景)

      • 支持存储海量数据;(例如:直播中的打赏数据);

      • 支持频繁的数据读写;(例如:游戏道具);

      • 数据安全性不高,存在数据误差(丢失数据);

      • mongoDB不支持多表操作,不支持事务;

      • mongoDB使用Bson存储格式,支持动态字段管理;

      3. mongoDB与mysql、redis对比

      与redis对比

      1. redis纯内存数据库,内存不足时触发淘汰策略,mongoDB使用内存加磁盘的存储策略具有高扩展性;

      2. mongoDB使用Bson存储格式,支持动态字段管理方便扩展;

      与mysql对比

      1. mongoDB不支持多表操作,不支持事务;

      2. mongoDB使用Bson存储格式,支持动态字段管理;

      查询效率对比

      Redis > MongoDB > MySQL

      4. mongoDB存储原理

      docker安装mongoDB及使用方法是什么

      1. mongoDb采用内存加磁盘的方式存储数据;

      2. mongoDb支持数据分片,当单一的服务器中磁盘不够用的时候,还可以串联其他服务器;

      3. 客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;

      4. 内存中的日志每10ms向磁盘中的日志进行同步一次,数据则每分钟同步一次;

      5. 客户端先去内存中查询数据,内存中没有再去查询磁盘;

      6. 当客户端写入的时候,会先写入到内存中,内存中写入后请求直接返回,内存中的数据会根据同步策略同步到磁盘;

      7. 如果机器宕机,在重启服务的时候会解析磁盘中的日志和磁盘中的数据进行对比,将未入到磁盘中的数据写入磁盘,但可能会丢失10ms的数据;

      二、使用docker安装mongo

      1.安装

      拉取mongo镜像

       docker pull mongo:4.4

      创建mongo数据持久化目录

      mkdir -p /docker_volume/mongodb/data

      运行容器

      docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
      -v: 将宿主机的/docker_volume/mongodb/data映射到容器的/data/db目录,将数据持久化到宿主机,以防止删除容器后,容器内的数据丢失
      –auth:需要密码才能访问容器服务

      2.创建用户

      登录mongo容器,并进入到【admin】数据库

      docker exec -it mongo mongo admin

      创建一个用户,mongo 默认没有用户

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

      【user:‘root’ 】:设置用户名为root
      【pwd:‘123456’】:设置密码为123456
      【role:‘userAdminAnyDatabase’】:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
      【db: ‘admin’】:可操作的数据库
      【‘readWriteAnyDatabase’】:赋予用户读写权限

      dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

      3. 连接、测试

      连接mongo数据库

      db.auth('root', '123456')

      测试数据库,插入一条语句

      db.user.insert({"name":"zhangsan","age":18})

      测试数据库,查询刚才插入的语句

      db.user.find()

      docker安装mongoDB及使用方法是什么

      navicat连接测试

      docker安装mongoDB及使用方法是什么

      三、SpringBoot整合mongoDB

      导入坐标

              
                  org.springframework.boot
                  spring-boot-starter-data-mongodb
                   2.3.9.RELEASE
              

      添加yml配置

      spring:
        data:
          mongodb:
            uri: mongodb://192.156.136.168:27017/testdb
            username: root
            password: 123456

      编写实体类

      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      import org.bson.types.ObjectId;
      import org.springframework.data.annotation.Id;
      import org.springframework.data.mongodb.core.mapping.Document;
      import org.springframework.data.mongodb.core.mapping.Field;
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      //指定实体类和数据库文档的映射关系    默认实体类名  数据库如果没有该文档,会自动创建
      @Document(value="tb_person")
      public class Person {
          @Id
          private ObjectId id; //mongoDB推荐使用ID
          //指定属性名和数据库域的映射关系   默认属性名
          @Field("person_name")
          private String name;
          private int age;
          private String address;
      }

      1.@Document(value=“tb_person”) :指定实体类和数据库文档的映射关系 默认实体类名 数据库如果没有该文档,会自动创建
      2. @Field(“person_name”): //指定属性名和数据库域的映射关系 默认属性名

      测试类

      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.data.domain.Sort;
      import org.springframework.data.mongodb.core.MongoTemplate;
      import org.springframework.data.mongodb.core.query.Criteria;
      import org.springframework.data.mongodb.core.query.Query;
      import org.springframework.data.mongodb.core.query.Update;
      import org.springframework.test.context.junit4.SpringRunner;
        
          /**
           * 多条件查询
           */
          @Test
          public void find() {
              //设置查询条件 age小于30,且person_name="张三"
              Criteria criteria = Criteria.where("age").lt(30)
                      .and("person_name").is("张三");
              
              //设置查询条件
              Query query = new Query(criteria);
              //查询
              List list = mongoTemplate.find(query, Person.class);
      
              for (Person person : list) {
                  System.out.println(person);
              }
          }
      
          /**
           * 分页查询
           */
          @Test
          public void findPage() {
              //设置查询条件 age小于30,且person_name="张三"
              Criteria criteria = Criteria.where("age").lt(30)
                      .and("person_name").is("张三");
      
              //根据条件 查询总数
              Query queryCount = new Query(criteria);
              long count = mongoTemplate.count(queryCount, Person.class);
      
      
              //查询当前页的数据列表, 查询第二页,每页查询2条
              Query queryLimit = new Query(criteria)
                      .with(Sort.by(Sort.Order.desc("age")))
                      .limit(2)//每页查询条数
                      .skip(2); //从第几页开始 (page-1)*size
      
              List list = mongoTemplate.find(queryLimit, Person.class);
              for (Person person : list) {
                  System.out.println(person);
              }
          }
          
          /**
           * 更新数据
           */
          @Test
          public void update() {
              //设置查询条件 age小于30,且person_name="张三"
              Criteria criteria = Criteria.where("person_name").is("王五");
              //设置更新条件
              Query query = new Query(criteria);
              //设置更新数据
              Update update = new Update();
              update.set("age", 16);
              mongoTemplate.upsert(query, update, Person.class);
          }
      
          /**
           * 保存
           */
          @Test
          public void save() {
              Person person = new Person();
              person.setName("张三");
              person.setAge(18);
              mongoTemplate.save(person);
          }
          
          /**
           * 删除数据
           */
          @Test
          public void dlete() {
              mongoTemplate.remove(Query.query(Criteria.where("person_name").is("张三")), Person.class);
          }

      mongoDB索引

      提示:1 :升序索引 -1 :降序索引

      #查看索引
      db.user.getIndexes()
      #创建索引
      #db.user.createIndex({'age':1})

      四、mongoDB原生使用

      新增

      db.tb_person.insert({person_name: "陈六", age: 16})

      修改

      -- 普通修改
      db.tb_person.update({age: 16}, {$set: {person_name: "张三"}})

      修改格式:db.collection.update(query, update, [ upsert: boolean, multi: boolean, writeConcern: document])

      db.tb_person.update({age: 16}, {$set: {person_name: "张三"}}, {upsert: true, multi: true})
      
      	--  upsert (默认false ) : 可选,如果不存在update的记录,是否保存。true为保存。
      	--  multi(默认false ) : 可选,默认只更新第一条记录。true:更新所有匹配数据
      	--  writeConcern :可选,抛出异常的级别

      删除

      -- 普通删除
      db.tb_person.remove({person_name: "张三"})

      删除格式:db.collection.remove(query, update, [ justOne: boolean, writeConcern: document])

      db.tb_person.remove({person_name: "张三"}, false)
      
      	-- justOne: (可选)true:删除第一个匹配记录,false:删除所有
      	-- writeConcern :(可选)抛出异常的级别

      查询

      --  查询person_name=张三 或者 年龄 18
      db.tb_person.find({$or:[{person_name: "张三"},{age:18 }]}) 
      
      -- 分页查询  以年龄升序排序 跳过第1条数据,查询后面2条数据
      db.tb_person.find().sort({age:1}).limit(2).skip(1)  
      
      -- 查询年龄小于等于21的数据,以年龄降序排序
      db.tb_person.find({age:{$lte:21}}).sort({age:-1})

      常用查询条件

      中文符号
      小于$lt:
      大于$gt:
      小于或等于$lte:
      大于或等于$gte:
      不等于$ne:
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>