本文最后更新于:2024年8月15日 下午

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案,本文记录相关基础知识。

MongoDB 概述

定义

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

特点

  • 它的特点是高性能易部署易使用

  • 主要功能特性有:

    • 面向集合存储,易存储对象类型的数据。

    • 模式自由。

    • 支持动态查询。

    • 支持完全索引,包含内部对象。

    • 支持查询。

    • 支持复制和故障恢复。

    • 使用高效的二进制数据存储,包括大型对象(如视频等)。

    • 自动处理碎片,以支持云计算层次的扩展性

    • 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

    • 文件存储格式为BSON(一种JSON的扩展)。

    • 可通过网络访问。

使用原理

  • 面向集合(Collection-Oriented)
    • 数据被分组存储在数据集中,被称为一个集合(Collection)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。Nytro MegaRAID技术中的闪存高速缓存算法,能够快速识别数据库内大数据集中的热数据,提供一致的性能改进。
  • 模式自由(schema-free)
    • 对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)。

使用场景

  • MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。
适用场景

网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

  • 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。

  • 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。

  • 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。

  • 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。

不适用场景
  • 高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

  • 传统的商业智能应用:针对特定问题的BI 数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

  • 需要SQL 的复杂的跨文档(表)级联查询问题。

教程链接

MongoDB 安装

windows

  • MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,选择Windows相应的版本即可,你可以从 MongoDB 官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/try/download/community

  • 下载zip包后,解压安装包,并安装它。

  • 强烈建议 安装选项 “install mongoDB compass” 不勾选(当然你也可以选择安装它,可能需要更久的安装时间)

    MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass。

Linux

  • mongodb 会在 /data/db 文件夹中保存数据,建议在安装之前建立好该文件夹并赋予权限
1
2
sudo mkdir /data/db
sudo chown `whoami` /data/db
6.0 之前版本
  • MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,选择你使用的Linux系统相应的版本即可,你可以从 MongoDB 官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/try/download/community
  • 这里我们选择 tgz 下载,下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装) 。
1
2
3
4
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz        # 下载
tar -zxvf mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz # 解压
mv mongodb-src-r4.2.8 /usr/local/mongodb
# 将解压包拷贝到指定目录
  • MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:
1
export PATH=<mongodb-install-directory>/bin:$PATH
  • 为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb
1
export PATH=/usr/local/mongodb/bin:$PATH
6.0.1 + 版本
  • MongoDB 6 之后的版本需要额外安装 MongoShell 工具
  • 首先下载 mongodb 安装包

下载地址:https://www.mongodb.com/try/download/community

1
2
3
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.1.tgz
tar -zxvf mongodb-linux-x86_64-ubuntu2004-6.0.1.tgz
mv mongodb-linux-x86_64-ubuntu2004-6.0.1 /usr/local/mongodb
  • 之后需要安装 mongodb shell

  • 下载 shell 工具包

下载地址: https://www.mongodb.com/try/download/shell

1
2
3
wget https://downloads.mongodb.com/compass/mongodb-mongosh_1.5.4_amd64.deb
chmod +x mongodb-mongosh_1.5.4_amd64.deb
sudo dpkg -i mongodb-mongosh_1.5.4_amd64.deb
  • 运行 mongosh

  • 查看版本
1
2
test> db.version()
6.0.1

Docker

拉取 MongoDB Docker 镜像

1
docker pull mongodb/mongodb-community-server:latest

将镜像作为 container 运行

1
docker run --name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest

此命令中的 -p 27017:27017 会将容器端口映射到主机端口。这样即可使用一个 localhost:27017 连接字符串连接到 MongoDB。

要安装特定版本的 MongoDB,请在 Docker run 命令中的 : 后面指定版本。Docker 会拉取并运行指定的版本。

例如,要运行 MongoDB ,请执行以下操作:

1
docker run --name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest

之后在容器中执行 /bin/mongod 开启数据库

数据库开启后执行 /bin/mongosh

可以看到 MongoDB 版本

1
2
Using MongoDB:		7.0.12
Using Mongosh: 2.2.15

Mongodb 测试

MongoDB Shell

MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

  • 如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。

此处我执行了db.version()命令,你也可以用这个命令判断shell是否正常运行。

  • 由于它是一个JavaScript shell,您可以运行一些简单的算术运算:
1
2
3
4
5 * 5
25
25 + 3
28
  • 现在的版本默认将数据存储在bin同级目录data中,可以尝试新建数据条目(默认数据库为test):
1
2
3
4
db.vvd.insert({x:10})
WriteResult({ "nInserted" : 1 })
db.vvd.find()
{ "_id" : ObjectId("6023a73a728a5e21792ad6c8"), "x" : 10 }

该命令将数据 10 插入到test数据库的vvd集合的x字段里。

验证部署结果

  • 查看 mongodb 版本

在mongosh 中

1
2
db.version()
7.0.12
  • 查看 mongosh 版本

在 shell 中

1
2
./mongosh -version     
2.2.15
  • hello world, 在 mongosh 中执行
1
2
3
4
5
db.runCommand(
{
hello: 1
}
)

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
isWritablePrimary: true,
topologyVersion: {
processId: ObjectId('66bc633b9e379377e022c7fe'),
counter: Long('0')
},
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
localTime: ISODate('2024-08-14T08:42:12.537Z'),
logicalSessionTimeoutMinutes: 30,
connectionId: 13,
minWireVersion: 0,
maxWireVersion: 21,
readOnly: false,
ok: 1
}

远程连接

连接教程

在远程设备 192.168.1.2 上安装了 MongoDB,暴露端口 27017,如果需要远程登录可以在本机安装 Mongosh

1
mongosh "mongodb://192.168.1.2:27017"

后台启动

  • /lib/systemd/system 文件夹创建 mongodb.service 文件,写入内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description = Service to start mongod
After = network.target

[Service]
ExecStart = /usr/local/mongodb/bin/mongod
StandardOutput = inherit
StandardError = inherit
Restart = always
User = lighthouse

[Install]
WantedBy=multi-user.target

  • 运行命令,开启服务,设置开机自动启动:
1
2
sudo systemctl start mongodb.service
sudo systemctl enable mongodb.service

错误解决

启动 mongosh 被拒绝

1
2
3
4
$ mongosh
Current Mongosh Log ID: 631005e96d4800b33699fc88
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.5.4
MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017
  • 原因:mongod 服务没有正常启动

mongod 启动错误

  • 在运行 mongod 命令时如果有错误会打印在控制台,可以依据信息排查
  1. Attempted to create a lock file on a read-only directory: /data/db
  • 错误信息
1
{"t":{"$date":"2022-09-01T09:10:10.519+08:00"},"s":"E",  "c":"CONTROL",  "id":20557,   "ctx":"initandlisten","msg":"DBException in initAndListen, terminating","attr":{"error":"IllegalOperation: Attempted to create a lock file on a read-only directory: /data/db"}}
  • 出现这个错误是由于 /data/db 文件夹权限没有给够
  • 可以 chomd -R 777 也可以修改文件夹所有者
  1. Operation not permitted
  • 错误信息
1
2
{"t":{"$date":"2022-09-01T09:12:16.295+08:00"},"s":"E",  "c":"WT",       "id":22435,   "ctx":"initandlisten","msg":"WiredTiger error message","attr":{"error":1,"message":{"ts_sec":1661994736,"ts_usec":294521,"thread":"4307:0x7fc5c2e4bcc0","session_dhandle_name":"file:WiredTiger.wt","session_name":"connection","category":"WT_VERB_DEFAULT","category_id":9,"verbose_level":"ERROR","verbose_level_id":-3,"msg":"__posix_open_file:805:/data/db/WiredTiger.wt: handle-open: open","error_str":"Operation not permitted","error_code":1}}}

  • 实话说如果已经给了 /data/db 文件夹权限,这是个摸不着头脑的错误
  • 实际底层原因不清楚,但是导致错误的原因很可能是 /data/db 文件夹权限给晚了,导致需要创建一些文件没建起了
  • 解决方案:做好数据备份,删掉 /data/db 内容,重新运行 mongod

Illegal instruction (core dumped)

这个错误八成是因为系统内核或 gcc 版本没有达到 mongodb 需求的版本号

我尝试了很久最终还是通过降级 mongodb 版本解决的问题,从6.0.5 一路降到 3.6.8 才能运行

  • 卸载旧版本

    1
    sudo apt purge mongodb-*
  • 安装命令

    1
    2
    sudo apt install mongodb-service-core
    sudo apt install mongodb-client

参考资料



文章链接:
https://www.zywvvd.com/notes/coding/dataset/mongodb/MongoDB/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

MongoDB 简介与安装
https://www.zywvvd.com/notes/coding/dataset/mongodb/MongoDB/
作者
Yiwei Zhang
发布于
2021年2月10日
许可协议