0


docker安装mongoDB及使用

文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、mongoDB是什么?

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

1. mongo的体系结构

在这里插入图片描述

  1. mongo中的集合相当于mysql中表的概念;
  2. mongo中的文档相当于mysql中行的概念;
  3. mongo中的域相当于mysql中字段/列的概念;

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

  1. 支持存储海量数据;(例如:直播中的打赏数据);
  2. 支持频繁的数据读写;(例如:游戏道具);
  3. 数据安全性不高,存在数据误差(丢失数据);
  4. mongoDB不支持多表操作,不支持事务;
  5. mongoDB使用Bson存储格式,支持动态字段管理;

3. mongoDB与mysql、redis对比

与redis对比

  1. redis纯内存数据库,内存不足时触发淘汰策略,mongoDB使用内存加磁盘的存储策略具有高扩展性;
  2. mongoDB使用Bson存储格式,支持动态字段管理方便扩展;

与mysql对比

  1. mongoDB不支持多表操作,不支持事务;
  2. mongoDB使用Bson存储格式,支持动态字段管理;

查询效率对比
Redis > MongoDB > MySQL

4. mongoDB存储原理

在这里插入图片描述

  1. mongoDb采用内存加磁盘的方式存储数据;
  2. mongoDb支持数据分片,当单一的服务器中磁盘不够用的时候,还可以串联其他服务器;
  3. 客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;
  4. 内存中的日志每10ms向磁盘中的日志进行同步一次,数据则每分钟同步一次;
  5. 客户端先去内存中查询数据,内存中没有再去查询磁盘;
  6. 当客户端写入的时候,会先写入到内存中,内存中写入后请求直接返回,内存中的数据会根据同步策略同步到磁盘;
  7. 如果机器宕机,在重启服务的时候会解析磁盘中的日志和磁盘中的数据进行对比,将未入到磁盘中的数据写入磁盘,但可能会丢失10ms的数据;

二、使用docker安装mongo

1.安装

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

2.创建用户

  1. 登录mongo容器,并进入到【admin】数据库
 docker exec -it mongo mongo admin
  1. 创建一个用户,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. 连接、测试

  1. 连接mongo数据库
db.auth('root','123456')
  1. 测试数据库,插入一条语句
 db.user.insert({"name":"zhangsan","age":18})
  1. 测试数据库,查询刚才插入的语句
 db.user.find()

在这里插入图片描述

  1. navicat连接测试在这里插入图片描述

三、SpringBoot整合mongoDB

  1. 导入坐标
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.3.9.RELEASE</version></dependency>
  1. 添加yml配置
spring:
  data:
    mongodb:
      uri: mongodb://192.156.136.168:27017/testdb
      username: root
      password:123456
  1. 编写实体类
importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importorg.bson.types.ObjectId;importorg.springframework.data.annotation.Id;importorg.springframework.data.mongodb.core.mapping.Document;importorg.springframework.data.mongodb.core.mapping.Field;@Data@AllArgsConstructor@NoArgsConstructor//指定实体类和数据库文档的映射关系    默认实体类名  数据库如果没有该文档,会自动创建@Document(value="tb_person")publicclassPerson{@IdprivateObjectId id;//mongoDB推荐使用ID//指定属性名和数据库域的映射关系   默认属性名@Field("person_name")privateString name;privateint age;privateString address;}

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

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


本文转载自: https://blog.csdn.net/packge/article/details/126539320
版权归原作者 要加油! 所有, 如有侵权,请联系我们删除。

“docker安装mongoDB及使用”的评论:

还没有评论