MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作
文章目录
- 1. 容器与应用之间的关系介绍
- 2. 使用 Docker 容器安装 MongoDB
- 3. Mongosh 操作
- 3.1 Mongosh 连接到 MongoDB
- 3.2 基础操作与 CRUD
- 4. Python 操作 MongoDB
- 5. Nodejs 操作 MongoDB
- 参考文献
1. 容器与应用之间的关系介绍
MongoDB 的安装有时候并不是那么容易的,为了简化这个步骤,比较舒适好用的方法是使用容器(Container)安装。
在这里为读者简单介绍一下容器及其应用。在讲容器之前先说一下容器的镜像(Image),镜像是容器的基础,是一个关于某些应用的软件包,在镜像里规定了要运行这个应用需要准备的所有内容,包括代码、运行时、库、环境变量和配置文件等。通过一个镜像可以创建和运行容器实例。镜像和容器的关系可以比作类和类实例的关系,前者是基础、是模板,后者是前者的实际用例。 (镜像如下图1)

容器是一整套的应用,包含了应用程序本身及其所有依赖项(库、运行时、系统工具、设置等)。使用容器启动一个应用程序,不需要手动为应用解决各种依赖和系统环境问题,启动即使用。以 MongoDB 为例,想要启动 MongoDB 只需下载 MongoDB 的镜像,随后根据这个镜像创建容器即可启动一个 MongoDB 服务。不过这个 MongoDB 实际上并不是完全在本地。(容器如下图2)

我们以在 Linux 主机内安装一个 MongoDB 为例:要在 Linux 的环境下安装,为此就需要一个系统,所以在这个容器里,除了 MongoDB,还要搭上一个系统。整理说明即是,在我们的 Linux 主机(最先希望安装数据库的机器)中,有一个容器,在这个容器内有一个 Linux 的系统,在这个系统中,安装了一个 MongoDB 的服务。到这里是否有个疑问——这应该算是在当前主机访问另一个主机了,那么我们要怎么访问这个 MongoDB 呢?是否应该进入到这个系统中,然后像使用别的数据库那样,打开一个 CLI 客户端,输入指令进行增删改查呢?
当然,这确实是一种访问方式。实际上我们知道就算是安装在本地的数据库,也会选择工作在一个端口中。譬如 MySQL 的 3306,Redis 的 6379,MongoDB 的是 27017。所以容器就将系统内端口与主机的端口建立了相互的映射,将容器内的一个端口映射成主机的端口,就像是上面图 2 的 PORTS 所示,此时容器的 27017 端口就是主机的 27017 端口,访问主机的 27017 端口即是访问容器的 27017 端口。
2. 使用 Docker 容器安装 MongoDB
-
使用以下命令安装一个 Docker,如果你还没有的话
apt install docker.io安装完毕后可以使用以下命令验证,如正确安装会显示一个版本号
docker --version -
使用以下命令下载 MongoDB 镜像
docker pull mongo下载完成后可以使用以下命令查看镜像列表
docker images -
使用下载好的镜像启动 MongoDB 容器
docker run -d -p 27017:27017 --name my-mongodb mongo在上述命令中,run 是启动一个容器,
-d是指定在后台运行;-p是在主机和容器之间创建端口映射,冒号左侧是主机端口,右侧是容器端口;--name是为当前容器命名,mongo是镜像名,如果有版本需求,还可以加上版本标签,如mongo:latest,具体的镜像名称和版本号可以通过镜像列表查看。容器启动后的情况使用
docker ps命令查看如下图划线部分所示:
-
使用下面的命令在进入到容器内
docker exec -it 8424792f4ec4 /bin/bash其中
exec是指在容器内执行命令,-i是使标准输入保持打开,-t是分配一个伪终端,同时使用可以理解为交互式执行命令,并分配一个伪终端,8424792f4ec4是容器的 ID,保证唯一的情况下可以简略输入。/bin/bash是实际使用的 Shell(Shell 可以理解为一种命令行界面),当然你也可以只输入bash,这是一样的效果。由此可以持续性地操作容器。情况大概如下图所示,与操作 Linux 没什么不同,顺便一提得是,从 MongoDB 的 Dockerfile 中可以看到,这个 MongoDB 是在 Debian 系统之上安装的。
-
在容器内使用如下命令,进入到 MongoDB 的 Shell 中。
mongosh当出现下面的状态时就代表了成功进入,那之后的操作将会在下文中详细说明。

-
如需了解更多的 Docker 命令,可以查阅此文档 https://dockerdocs.cn/reference/index.html
3. Mongosh 操作
3.1 Mongosh 连接到 MongoDB
在 2.5 中使用 mongosh 命令连接到 MongoDB 仅为使用默认参数,该命令加上一些可能使用到的参数后类似于下面这个命令:
mongosh --host localhost --port 27017
或者类似于下面这一行:
mongosh "mongodb://localhost:27017"
这在 MongoDB 中被称为连接串(Connection String),即使用一个字符串来代表所有的参数。连接串的使用常见于使用代码连接 MongoDB 的场景。
为了安全性,一般需要启用密码来登录 MongoDB。在容器中要通过 conf 来使用密码比较困难,推荐的做法是在容器启动的时候设置一些环境变量来启用密码,如下:
docker run -d -p 27017:27017 --name my-mongodb2 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=admin123 \
-e MONGO_INITDB_DATABASE=admin \
mongo
这个命令在启动容器的时候为 Mongodb 设置了一个 ROOT 用户 admin,密码是 admin123,在指定的数据库 admin 中进行身份验证。
这个时候如果只像上文一样,Mongosh 只设置了端口号和主机名的话,是没有权限操作的,得到的结果就像下面一样:
test> show databases
MongoServerError: Command listDatabases requires authentication
使用以下的方法选择一个进行身份验证:
1. mongosh --username admin --password admin123
2. mongosh "mongodb://admin:admin123@localhost:27017"
3. mongosh --username admin --password admin123 --authenticationDatabase admin
4. mongosh "mongodb://admin:yejue123@localhost:27017/database?authSource=admin"
如果你的用户是创建在 admin 数据库以外的,需要指定在哪个数据库进行验证,并且登录后也只能看到那一个数据库。
另外,可以依次执行下列命令看到容器在启动时设置的用户:
use admin
show collections
db.system.users.find()

3.2 基础操作与 CRUD
以下列出一些简单的操作:
# 显示数据库
show databases# 创建数据库/切换数据库
use databasename# 查看内置的 role
show roles# 在当前数据库创建一个用户
db.createUser({user: username, pwd: password, roles: [{role: "readWrite", db: dbtabases name}]}
)# 查看当前数据库的所有用户
db.getUsers()# 查看所有的集合
show collections
Mongodb 是面向文档的 NoSQL 的数据库,数据通常以 BSON 格式存储,而在 Mongosh 中看到的则是以 JSON 格式显示的。MongoDB 有三种组织数据的层级:数据库,集合(Collection)、文档(Document)。他们之间的关系用一句话概括即“在一个数据库中有若干个集合,集合内通常存放着有相似内容的文档”。如果以关系型数据库来类比,则集合相当于一个表,一个文档相当于一行记录。这个文档并非常见的“文件文档”,而是一个键值对形式的 JSON/BSON 对象。
4. Python 操作 MongoDB
5. Nodejs 操作 MongoDB
参考文献
https://www.mongodb.com/zh-cn/document-databases
https://www.mongodb.com/docs/mongodb-shell/crud/