MongoDB 基础教程:安装、配置与使用
1. 简介
MongoDB 是一个开源的、高性能、可扩展的 NoSQL 数据库。与传统的关系型数据库(如 MySQL、PostgreSQL)不同,MongoDB 采用文档模型(BSON,类似 JSON 格式)来存储数据,这意味着它更灵活,能够更好地处理非结构化和半结构化数据。它的特点包括:
- 文档模型: 数据以灵活的 JSON-like 文档形式存储。
- 高可用性: 通过复制集(Replica Sets)提供数据冗余和自动故障转移。
- 横向扩展: 通过分片(Sharding)支持大数据量的存储和高并发读写。
- 丰富的查询语言: 支持强大的查询表达式、聚合框架等。
- 高性能: 内置索引支持,内存映射存储引擎等。
MongoDB 广泛应用于各种场景,如大数据、内容管理、移动应用后端、物联网等。
2. 安装 MongoDB
MongoDB 提供了多种安装方式,包括使用包管理器、下载二进制文件或使用 Docker。下面我们将介绍在主流操作系统上的安装方法。
2.1 Windows
- 下载 MongoDB Community Server: 访问 MongoDB 官方下载中心 (https://www.mongodb.com/try/download/community)。
- 选择版本和平台: 选择最新的稳定版,并确保平台是
Windows。下载MSI安装包。 - 运行安装程序: 双击下载的
.msi文件,启动安装向导。 - 选择安装类型: 建议选择
Complete安装,这将安装所有组件。 - 服务配置:
- 在
Service Configuration步骤,通常选择Run service as Network Service user。 - 记录下
Data Directory和Log Directory的路径,默认通常在C:\Program Files\MongoDB\Server\<version>\data和C:\Program Files\MongoDB\Server\<version>\log。
- 在
- 安装 MongoDB Compass(可选): 勾选安装 MongoDB Compass,这是一个官方提供的 GUI 工具,方便管理和查询数据。
- 完成安装: 按照向导指示完成安装。
- 添加到 PATH (可选但推荐): 将 MongoDB 的
bin目录(例如C:\Program Files\MongoDB\Server\<version>\bin)添加到系统的环境变量Path中,这样就可以在任何命令行窗口直接运行mongo或mongosh命令。
2.2 macOS
通过 Homebrew 安装是最推荐的方式。
- 安装 Homebrew (如果尚未安装):
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - 安装 MongoDB Community Server:
bash
brew tap mongodb/brew
brew install mongodb-community@<version> # 替换 <version> 为你想要的版本,如 6.0 - 启动 MongoDB 服务:
bash
brew services start mongodb-community@<version>
你也可以手动启动:
bash
mongod --config /opt/homebrew/etc/mongod.conf # 或 /usr/local/etc/mongod.conf - 停止 MongoDB 服务:
bash
brew services stop mongodb-community@<version>
2.3 Linux (Ubuntu/Debian)
以 Ubuntu 为例,其他发行版类似。
- 导入 MongoDB 公钥:
bash
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
(注意:apt-key在新版 Ubuntu 中可能被弃用。对于新版本,推荐使用以下方法创建keyring文件:)
bash
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo tee /etc/apt/trusted.gpg.d/mongodb-org-6.0.asc - 为 MongoDB 创建列表文件:
bash
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/<version> multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-<version>.list
# 替换 <version> 为你想要的 MongoDB 版本,如 6.0 - 更新本地包数据库:
bash
sudo apt update - 安装 MongoDB 包:
bash
sudo apt install -y mongodb-org - 启动 MongoDB 服务:
bash
sudo systemctl start mongod - 验证 MongoDB 服务状态:
bash
sudo systemctl status mongod
如果显示active (running)则表示启动成功。 - 配置开机自启动:
bash
sudo systemctl enable mongod
2.4 Docker
使用 Docker 是跨平台和快速部署 MongoDB 的好方法。
- 拉取 MongoDB 镜像:
bash
docker pull mongo - 运行 MongoDB 容器:
bash
docker run --name some-mongo -p 27017:27017 -d mongo--name some-mongo: 为容器指定一个名称。-p 27017:27017: 将容器的 27017 端口映射到主机的 27017 端口。-d: 后台运行。
- 连接到容器内的 MongoDB (可选):
bash
docker exec -it some-mongo mongosh
或者直接从宿主机连接mongosh。 - 持久化数据: 建议挂载数据卷以避免容器删除时数据丢失:
bash
docker run --name some-mongo -p 27017:27017 -v /your/data/path:/data/db -d mongo
# 替换 /your/data/path 为你希望存储 MongoDB 数据的本地路径
3. 配置 MongoDB
MongoDB 的主要配置文件是 mongod.conf(或 mongodb.conf)。在 Windows 上,默认路径通常是 C:\Program Files\MongoDB\Server\<version>\bin\mongod.cfg;在 Linux/macOS 上,通常在 /etc/mongod.conf 或 /usr/local/etc/mongod.conf。
以下是一些常见的配置项:
“`yaml
mongod.conf 示例
数据存储目录
storage:
dbPath: /var/lib/mongodb # MongoDB 数据文件存放路径
journal:
enabled: true # 启用日志,确保数据完整性
系统日志配置
systemLog:
destination: file # 日志输出到文件
logAppend: true # 日志追加模式
path: /var/log/mongodb/mongod.log # 日志文件路径
网络配置
net:
port: 27017 # MongoDB 监听端口
bindIp: 127.0.0.1 # 监听的 IP 地址,默认为本地回环地址。
# 如果需要外部访问,可以设置为 0.0.0.0 (不推荐生产环境) 或指定特定 IP。
安全配置 (非常重要,尤其是生产环境)
security:
authorization: enabled # 启用用户认证,强烈建议开启!
# 开启后,需要创建用户并使用用户名密码连接。
复制集配置 (用于高可用性)
replication:
replSetName: “myReplicaSet” # 复制集名称
分片配置 (用于横向扩展)
sharding:
clusterRole: configsvr # 或者 shardsvr
“`
重要提示:
bindIp: 默认127.0.0.1意味着 MongoDB 只能从本机访问。如果需要从其他机器访问,必须修改为服务器的 IP 地址或0.0.0.0(允许所有 IP 访问,但生产环境应谨慎使用,并配合防火墙和授权)。security.authorization: enabled: 强烈建议在生产环境中启用用户认证! 启用后,你需要创建用户并为其分配角色,否则任何人都无法对数据库进行操作。
修改配置后,需要重启 MongoDB 服务才能生效。
- Linux:
sudo systemctl restart mongod - macOS (Homebrew):
brew services restart mongodb-community@<version> - Windows: 通过服务管理器重启
MongoDB Server (MongoDB)服务。
4. 连接 MongoDB
MongoDB 提供了一个交互式 shell mongosh(新版)或 mongo(旧版),以及各种语言的驱动程序。
4.1 使用 mongosh Shell
打开命令行或终端,输入 mongosh(或 mongo):
bash
mongosh
如果连接到远程服务器或非默认端口,可以使用:
bash
mongosh "mongodb://<host>:<port>"
mongosh "mongodb://localhost:27017" # 默认连接
如果启用了认证:
bash
mongosh "mongodb://<username>:<password>@<host>:<port>/<database>"
连接成功后,你会看到 > 提示符,可以开始执行命令。
4.2 创建管理员用户 (如果启用了认证)
在连接到 MongoDB 后(首次连接时可能不需要认证,或以 localhost 方式连接),你需要创建一个管理员用户。
- 切换到
admin数据库:
javascript
use admin - 创建用户:
javascript
db.createUser({
user: "adminUser",
pwd: "yourStrongPassword",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" }]
})userAdminAnyDatabase角色允许在任何数据库上进行用户管理。readWriteAnyDatabase角色允许在任何数据库上进行读写操作。
- 退出并重新连接: 退出
mongosh,然后使用新创建的管理员用户和密码重新连接:
bash
mongosh "mongodb://adminUser:yourStrongPassword@localhost:27017/admin"
或者在mongosh中连接后:
javascript
use admin
db.auth("adminUser", "yourStrongPassword")
5. MongoDB 基本使用 (CRUD 操作)
以下是使用 mongosh 进行基本 CRUD (Create, Read, Update, Delete) 操作的示例。
5.1 选择数据库
javascript
use myDatabase // 如果数据库不存在,MongoDB 会在第一次插入数据时创建它
这将切换到名为 myDatabase 的数据库。
5.2 插入数据 (Create)
数据存储在集合 (Collections) 中,集合类似于关系型数据库中的表。
每个文档 (document) 都是一个 BSON 对象。
插入单个文档:
javascript
db.users.insertOne({
name: "Alice",
age: 30,
city: "New York",
email: "[email protected]",
interests: ["coding", "reading"]
})
* users 是集合的名称。如果 users 集合不存在,MongoDB 会自动创建它。
插入多个文档:
javascript
db.products.insertMany([
{ name: "Laptop", brand: "Dell", price: 1200, inStock: true },
{ name: "Mouse", brand: "Logitech", price: 25, inStock: true },
{ name: "Keyboard", brand: "Razer", price: 80, inStock: false }
])
5.3 查询数据 (Read)
查询所有文档:
javascript
db.users.find() // 返回 users 集合中的所有文档
db.products.find().pretty() // .pretty() 方法以易读的格式显示结果
按条件查询:
“`javascript
// 查询 age 等于 30 的用户
db.users.find({ age: 30 })
// 查询 name 为 “Laptop” 的产品
db.products.find({ name: “Laptop” })
// 查询 price 大于 100 的产品
db.products.find({ price: { $gt: 100 } }) // $gt: greater than (大于)
// 查询 price 小于等于 50 的产品
db.products.find({ price: { $lte: 50 } }) // $lte: less than or equal to (小于等于)
// 查询 inStock 为 true 且 price 小于 100 的产品
db.products.find({ inStock: true, price: { $lt: 100 } })
// 查询 interests 包含 “coding” 的用户
db.users.find({ interests: “coding” })
// 查询 age 为 25 或 30 的用户 (OR 查询)
db.users.find({ $or: [{ age: 25 }, { age: 30 }] })
“`
投影 (Projection):
选择返回文档的特定字段。1 表示包含,0 表示排除(_id 字段默认包含,如果要排除需要显式设置 _id: 0)。
javascript
// 只返回 name 和 email 字段
db.users.find({}, { name: 1, email: 1, _id: 0 })
5.4 更新数据 (Update)
更新单个文档:
javascript
// 将 name 为 "Alice" 的用户的 age 更新为 31
db.users.updateOne(
{ name: "Alice" }, // 查询条件
{ $set: { age: 31 } } // 更新操作符
)
* $set 操作符用于设置字段的值。如果字段不存在,则会添加该字段。
更新多个文档:
javascript
// 将所有 inStock 为 true 的产品价格增加 10
db.products.updateMany(
{ inStock: true },
{ $inc: { price: 10 } } // $inc 操作符用于增加字段的值
)
替换文档:
replaceOne 会完全替换一个文档,除了其 _id。
javascript
db.users.replaceOne(
{ name: "Alice" },
{
name: "Alicia",
status: "active",
lastLogin: new Date()
}
)
注意: 替换后,原文档中 _id 以外的所有字段都会被新文档覆盖,旧文档中存在的但新文档中没有的字段将被移除。
5.5 删除数据 (Delete)
删除单个文档:
javascript
// 删除 name 为 "Alicia" 的用户
db.users.deleteOne({ name: "Alicia" })
删除多个文档:
javascript
// 删除所有 inStock 为 false 的产品
db.products.deleteMany({ inStock: false })
删除集合:
javascript
db.products.drop() // 删除整个 products 集合
删除数据库:
javascript
use myDatabase
db.dropDatabase() // 删除当前所在的数据库
6. 总结
本教程介绍了 MongoDB 的基础知识,包括其特点、在不同操作系统上的安装方法、核心配置文件 mongod.conf 的重要配置项,以及如何使用 mongosh 进行连接和执行基本的 CRUD 操作。
MongoDB 的强大功能远不止于此,包括索引、聚合框架、复制集、分片、事务等高级特性,这些都是在实际应用中提升性能、可用性和扩展性的关键。建议继续深入学习官方文档,探索更多功能,并结合实际项目进行实践。