docker安装mongoDB及使用方法详解

 更新时间:2023年03月16日 14:34:20   作者:要加油!  
这篇文章主要给大家介绍了关于docker安装mongoDB及使用的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、mongoDB是什么?

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

1. mongo的体系结构

  • 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存储原理

  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({<!--{C}%3C!%2D%2D%20%2D%2D%3E--> user:'root',pwd:'123456',roles:[ {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> 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({<!--{C}%3C!%2D%2D%20%2D%2D%3E-->"name":"zhangsan","age":18})

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

db.user.find()

navicat连接测试

三、SpringBoot整合mongoDB

导入坐标

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

添加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<Person> 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<Person> 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:

总结 

到此这篇关于docker安装mongoDB及使用方法的文章就介绍到这了,更多相关docker安装mongoDB内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker Swarm结合Docker Compose部署集群的实现

    Docker Swarm结合Docker Compose部署集群的实现

    本文主要介绍了Docker Swarm结合Docker Compose部署集群的实现,通过部署和配置帮助读者更好地理解并应用这些工具,感兴趣的可以了解一下
    2023-12-12
  • 使用Docker安装phabricator的配置和使用方法

    使用Docker安装phabricator的配置和使用方法

    今天小编就为大家分享一篇关于使用Docker安装phabricator的配置和使用方法的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • windows使用docker部署gitlab方式

    windows使用docker部署gitlab方式

    这篇文章主要介绍了windows使用docker部署gitlab方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Docker镜像与容器的导入导出以及常用命令总结

    Docker镜像与容器的导入导出以及常用命令总结

    Docker是一个开源的容器引擎,基于go语言开发并遵循了apache2.0协议开源,下面这篇文章主要给大家介绍了关于Docker镜像与容器的导入导出以及常用命令总结的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • docker 编辑Dockerfile 添加php7.2 acpu的问题

    docker 编辑Dockerfile 添加php7.2 acpu的问题

    这篇文章主要介绍了docker 编辑Dockerfile 添加php7.2 acpu问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Docker容器网络互联的项目实践

    Docker容器网络互联的项目实践

    docker中的容器都是连接到一个虚拟的网桥上的,这为独立的容器提供了互联的可能,本文主要介绍了Docker容器网络互联的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • IDEA部署Docker到WSL2的详细过程

    IDEA部署Docker到WSL2的详细过程

    这篇文章主要介绍了IDEA 部署 Docker 到 WSL2的过程详解,本地环境Windows10+WSL2(Ubuntu),具体操作过程跟随小编一起看看吧
    2021-07-07
  • Idea部署远程Docker并配置文件

    Idea部署远程Docker并配置文件

    这篇文章给大家介绍Idea部署远程Docker并添加配置文件的方法及修改项目pom文件的代码解析,对idea部署远程docker相关知识感兴趣的朋友一起看看吧
    2021-06-06
  • 详解Docker学习之用commit命令创建镜像

    详解Docker学习之用commit命令创建镜像

    这篇文章主要介绍了详解Docker学习之用commit命令创建镜像,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Linux Docker运行springboot项目的步骤详解

    Linux Docker运行springboot项目的步骤详解

    这篇文章主要介绍了Linux Docker运行springboot项目的步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论