建议参考官方网站的安装教程:Install MongoDB — MongoDB Manual
本文以 Community Edition 社区版为例
在 Linux 中安装 MongoDB
方式1:使用 Linux 发行版中的包管理器安装,例如 CentOS Linux 中的 yum、Ubuntu 中的 apt
方式2:下载安装包手动安装
在 macOS 中安装 MongoDB
方式1:使用 Homebrew 包管理器安装管理 MongoDB 服务
方式2:下载安装包手动安装
在 Windows 中安装 MongoDB
方式1:使用 .msi 安装程序快速安装
方式2:下载安装包手动安装
从学习角度考虑建议下载安装包手动安装的方式,这样就可以知道更多的细节。
下面以 Windows 系统上下载安装包手动安装的方式演示安装过程。
关于 MongoDB 的版本号
从版本 3.2 之后不再支持 32 位操作系统,,更多平台支持请查看《Supported Platforms》
本例在 win10 操作系统下安装 5.0.4 版本 MongoDB
下载页面地址:https://www.mongodb.com/try/download/community
选择下载社区版 Community
Version:默认选择最新稳定版(current),也可以手动选择其他版本
rc
代表开发预览版,不建议使用Platform:安装平台,默认选择用户当前操作系统
Package:安装包类型,这里选择 zip 类型演示手动安装
将安装包解压到指定的安装目录。
├─ bin # 核心文件
│ ├─ Install-Compass.ps1
│ ├─ mongo.exe # 客户端,用于连接数据库的服务端,操作数据库中的数据
│ ├─ mongo.pdb
│ ├─ mongod.exe # 服务端,用于启动 MongoDB 数据库服务
│ ├─ mongod.pdb
│ ├─ mongos.exe
│ ├─ mongos.pdb
│ └─ vcredist_x64.exe
├─ LICENSE-Community.txt
├─ MPL-2
├─ README
└─ THIRD-PARTY-NOTICES
MongoDB 不是图形软件,而是在命令行下运行的命令行工具,所以不能双击 mongod.exe
打开,而应该在命令行下执行:
# 首先进入 bin 目录
cd mongodb安装目录/bin
# 执行文件
.\mongod.exe --version
但是这样非常的麻烦,要想在命令行的任何目录中直接使用这些可执行文件,只需要将可执行文件所属的 bin 目录配置到环境变量中。
首先复制 bin 目录地址,右键电脑打开属性:
重新打开命令行工具,运行命令测试是否配置成功。
mongod --version
现在命令行工具会现在当前目录查找名叫 mongod 的可执行文件,如果没有则会从配置的系统环境变量的目录中查找。
# 启动 MongoDB 数据库服务
mongod --dbpath="数据存储目录"
数据存储目录需要手动创建,启动服务后会在该目录下初始化一系列文件。
如果单独执行 mongod
,则会默认使用执行命令所处磁盘根目录的 /data/db
作为数据存储目录,前提是这个目录已经存在。
如果数据存储目录不存在,mongod
命令就会执行失败,例如:
NonExistentPath: Data directory C:\\data\\db\\ not found. Create the missing directory or specify another path using (1) the --dbpath command line option, or (2) by adding the 'storage.dbPath' option in the configuration file.
使用 mongo 命令连接数据库,测试数据库服务是否启动:
mongo
# 命令会输出版本号和 connect 连接结果等信息
MongoDB 服务默认监听 27017 端口号。
关闭命令行工具,或者 Ctrl + C
停止 mongod
命令即可停止数据库服务。
MongoDB shell 是 MongoDB 官方提供的一个在命令行中用来连接操作 MongoDB 服务的客户端工具,一个交互式 JavaScript shell 接口。官方介绍:Legacy mongo Shell
MongoDB shell 是 MongoDB Server 安装的一部分,如果已经安装了 Server,MongoDB shell 将安装到与服务器二进制文件相同的位置,即 mongo.exe
。
在命令行使用 mongo
命令连接数据库的时候会提示:
Warning: the "mongo" shell has been superseded by "mongosh", which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in an upcoming release.
For installation instructions, see https://docs.mongodb.com/mongodb-shell/install/
警告:"mongo" shell 已被 "mongosh" 取代,它提供了更好的可用性和兼容性。"mongo" shell 已被弃用,将在即将发布的版本中删除。
有关安装说明,请参阅 https://docs.mongodb.com/mongodb-shell/install/
MongoDB v5.0 开始不推荐使用 mongo
,而建议使用 mongosh
,需要单独安装,之后会介绍 MongoDB 可视化管理工具,这里就不安装了。
mongosh
向后兼容,支持的方法使用与 mongo
中相应方法相同的语法。关于新的 MongoDB Shell 和使用请参考官方介绍:MongoDB Shell
使用 mongo
命令运行 MongoDB Shell 连接 MongoDB 数据库。
# 查看 MongoDB Shell 版本
mongo --version
默认在没有任何命令行选项的时候,会使用默认端口 27017
连接本地主机上的 MongoDB 实例:
# 运行 MongoDB Shell,打开一个 JavaScript 执行环境
mongo
也可使用 --port
命令行选项指定端口号:
mongo --port 28015
连接远程主机上的 MongoDB 服务需要明确指定主机名和端口号。
可以指定一个连接字符串,例如:
# 默认连接地址
# 方式1:指定一个连接字符串
mongo "mongodb://127.0.0.1:27017"
# 方式2:使用 --host 选项
mongo --host 127.0.0.1:27017
# 方式3:使用 --host 和 --port 选项
mongo --host 127.0.0.1 --port 27017
默认 MongoDB 服务没有启用身份认证,如果要启用需要单独配置。
如果需要连接具有身份认证的 MongoDB 服务可以使用以下方式:
# 方式1:在连接字符串中指定用户名、身份验证数据库以及可选的密码,例如以 alice 用户身份连接远程 MongoDB 实例的 admin 数据库:
mongo "mongodb://[email protected]:28015/?authSource=admin"
# 方式2:使用命令行选项:
mongo --username alice --password --authenticationDatabase admin --host mongodb0.examples.com -- port 28015
# 如果指定 --password 选项而不输入密码,则 shell 程序将提示输入密码
使用 mongo
命令连接 MongoDB 后就进入 MongoDB Shell 执行环境,而不是终端。
注意:连接 MongoDB 服务和操作数据库的时候,需确保 MongoDB 服务是开启状态。
MongoDB Shell 提供了 JavaScript 执行环境,可以解析执行 JS 语言,除此之外,还包括:
由于 MongoDB 是文档型数据库,其中存储的数据就是熟悉的 JSON 格式数据。
可以把 MongoDB 数据库想象成一个超级大对象,这个对象就是整个数据库最外部的容器,对象里有不同的集合,集合中有不同的文档。
例如:
{
// 数据库 Database
"数据库1": {
// 集合 Collection,对应关系型数据库中的表 Table
"用户": [
// 文档 Document,对应关系型数据库中的行 Row
{
// 数据字段 Field,对应关系型数据库中的列 Column
"id": 1,
"username": '张三',
"password": "123"
},
{
"id": 2,
"username": '李四',
"password": "456"
}
],
"商品": [
{
"id": 1,
"name": "Switch",
"price": 100
},
{
"id": 2,
"name": "Mac",
"price": 200
}
]
},
// 数据库
"数据库2": {}
//...
}
在 MongoDB 中,数据库包含一个或多个文档集合。
# 在 MongoDB Shell 中执行
show dbs
# 输出:
admin 0.000GB
config 0.000GB
local 0.000GB
MongoDB 默认会有 3 个数据库,这些数据库名是保留的:
db
# 输出(默认)
test
MongoDB 默认使用的数据库为 test,如果没有创建新的数据库,集合将存放在 test 数据库中。
use <database>
在 MongoDB 中的数据库只有真正有了数据才会被创建,包括默认使用的 test 数据库。
可以使用 use
切换到不存在的数据库。首次将数据存储在数据中(例如通过创建集合)时,MongoDB 会创建数据库。
例如,以下命令使用 insertOne()
创建数据库 myNewDatabase
和集合 myCollection
:
use myNewDatabase
db.myCollection.insertOne( { x: 1 } )
# 切换到要删除的数据库
use <database>
# 删除当前数据
db.dropDatabase()
MongoDB Limits and Thresholds — Naming Restrictions
salesDB
,再创建数据库 salesdb
就会报错/\. "$*<>:|?
(注意包括空格)/\. "$
(注意包括空格)建议全部使用小写字母
MongoDB 将文档存储在集合中。集合类似与关系数据库中的表。
如果集合不存在,MongoDB 将在您首次存储该集合的数据时创建该集合。
例如,下例如果 myNewCollection2
和 myNewCollection3
集合不存在,insertOne
和 createIndex
方法就会创建各自的集合。
db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )
MongoDB 提供 db.createCollection()
方法显式创建具有各种选项的集合,例如最大大小或文档验证规则。
如果不需要指定选项,则无需显式创建,MongoDB 在首次存储数据时会创建新集合。
默认情况下,集合不要求其文档具有相同的架构,即 单个集合中的文档不需要具有相同的字段集,并且集合中的文档之间的字段数据类型可以不同。
这种灵活性在很多场景下也许并不适用,这些场景仍需要保证数据结构的一致性,在使用时可以对文档进行结构设置。
从 MongoDB 3.2 开始,您可以在更新和插入操作期间对集合强制执行文档验证规则。
# 查看当前数据库中的集合列表
show collections
# 删除当前数据库中的指定集合
db.集合名称.drop()
MongoDB Limits and Thresholds — Restriction on Collection Names
$
""
)system.
为前缀(保留供内部使用)mongosh
中的 db.getCollection()
方法或驱动程序(Drivers)中类似的方法.
点分隔符和 collection/view 的名称(例如 .
)MongoDB 将数据记录存储为 BSON 文档。
BSON(Binary) 是 JSON 文档的二进制表示,它包含比 JSON 更多的数据类型。
MongoDB 文档由 filed-value 对组成,具有以下结构:
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
MongoDB Limits and Thresholds — Restrictions on Field Names
.
和 $
的字段名,但使用上会出现很多问题,不建议使用
_id
保留用作主键_id
包含子字段,则子字段名称不能以 $
符号开头_id
字段Documents — The (_id) Field
在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id
字段作为主键。如果插入的文档省略 _id
字段,MongoDB 驱动程序会自动为 _id
字段生成 ObjectId
。
_id
字段具有以下行为和约束:
_id
字段上创建唯一索引。_id
字段始终是文档中的第一个字段。如果服务器首先接收到没有 _id
字段的文档,则服务器会将该字段移到开头。_id
的值在集合中必须是唯一的、不可变的_id
的值可以是任何 BSON 数据类型的值,除了 array、regex 和 undefined_id
包含子字段,则子字段名称不能以 $
符号开头BSON 文档的最大 size 为 16MB。
最大文档限制有助于确保单个文档不会使用过多的内存或在传输过程中使用过多的带宽。
为了存储超过最大限制的文档,MongoDB 提供了 GridFS API。更多信息请参阅 mongofiles 和驱动程序(Drivers)对应的文档。
与 JavaScript 对象不同,BSON 文档中的字段是有序的。
{a:1 b:1}
与 查询中的字段 {b:1, a: 1}
进行比较时_id
字段始终是文档中的第一个字段字段的值可以是任何 BSON 数据类型,包括其他文档、数组和文档数组。例如,以下文档包含各种类型的值:
var mydoc = {
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
上述字段具有以下数据类型:
_id
包含一个 ObjectIdname
保存一个嵌入的文档,其中包含 first
和 last
子字段birth
和 death
持有 Date 类型的值contribs
包含一个字符串数组views
包含 NumberLong 类型的值下面是 MongoDB 支持的常用 BSON 数据类型(更多查看 BSON Types):
类型 | 整数标识符 | 别名(字符串标识符) | 描述 |
---|---|---|---|
Double | 1 | “double” | 双精度浮点值。用于存储浮点值。 |
String | 2 | “string” | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Object | 3 | “object” | 用于内嵌文档 |
Array | 4 | “array” | 用于将数组或列表或多个值存储为一个键。 |
Binary data | 5 | “binData” | 二进制数据。用于存储二进制数据。 |
Undefined | 6 | “undefined” | 不建议使用 |
ObjectId | 7 | “objectId” | 对象 ID。用于创建文档的 ID。 |
Boolean | 8 | “bool” | 布尔值。用于存储布尔值(true/false)。 |
Date | 9 | “date” | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Null | 10 | “null” | 用于创建空值。 |
Regular Expression | 11 | “regex” | 正则表达式类型。用于存储正则表达式。 |
32-bit integer | 16 | “int” | 整型数值。用于存储 32 位整型数值。 |
Timestamp | 17 | “timestamp” | 时间戳。记录文档修改或添加的具体时间。 |
64-bit integer | 18 | “long” | 整型数值。用于存储 64 位整型数值。 |
Decimal128 | 19 | “decimal” | 数值类型。常用于存储更精确的数字,例如货币。 |
为了更方便的使用 MongoDB 学习数据的增删改查(CRUD),建议选择一款图形软件来操作:
这些工具各有优劣,根据喜好选择即可,本例使用 Navicat 工具。
Navicat 官方产品列表:
连接数据库
填写数据库连接信息,点击测试连接
测试连接成功,点击确定创建连接
双击左侧的数据库名称进行连接,默认不会显示 MongoDB 本身自带的 3 个数据库(admin、config、local)
使用 MongoDB Shell 添加数据自动创建 test 数据库:
mongo
db.user.insert({name: "张三", age: 18})
或直接在 Navicat 工具中右键新建数据库,通过新建查询添加数据:
首次添加数据后左侧数据库名称还是灰色的,可以右键刷新更新状态,双击集合查看集合内的数据:
点击 JSON 视图切换查看方式:
除了执行查询语句,也可以在图形界面中直接操作增删改查操作。
可视化工具只是方便管理数据库,在实际开发中还是需要通过接口执行 MongoDB 语法的命令操作数据库。
稍后会通过 Navicat 的查询窗口运行和学习 MongoDB 语法。