Skip to content

入门介绍

本章将介绍MongoDB的基本概念、安装配置方法以及MongoDB Shell的基本使用。

MongoDB概述

什么是MongoDB

MongoDB是一个基于分布式文件存储的开源数据库系统,由MongoDB Inc.开发。它使用BSON(Binary JSON)格式存储数据,是一种面向文档的NoSQL数据库。

javascript
// MongoDB文档示例
{
    "_id": ObjectId("507f1f77bcf86cd799439011"),  // 自动生成的唯一标识
    "name": "张三",           // 字符串类型
    "age": 25,                // 数字类型
    "email": "zhangsan@example.com",  // 字符串类型
    "hobbies": ["阅读", "编程", "旅游"],  // 数组类型
    "address": {              // 嵌套文档
        "city": "北京",
        "street": "朝阳路"
    },
    "createdAt": ISODate("2024-01-01T00:00:00Z")  // 日期类型
}

MongoDB的特点

javascript
// MongoDB的核心特点:

// 1. 文档模型
// 数据以文档形式存储,类似JSON对象,易于理解和操作
// 文档可以包含嵌套结构和数组

// 2. 灵活的Schema
// 同一集合中的文档可以有不同的字段
// 不需要预先定义表结构

// 3. 丰富的查询语言
// 支持条件查询、范围查询、正则匹配等
// 支持聚合管道进行复杂数据处理

// 4. 索引支持
// 支持多种索引类型(单字段、复合、文本、地理空间等)
// 支持索引优化查询性能

// 5. 高可用性
// 支持复制集(Replica Set)实现数据冗余
// 自动故障转移

// 6. 水平扩展
// 支持分片(Sharding)实现水平扩展
// 可处理海量数据

BSON数据格式

javascript
// BSON(Binary JSON)是MongoDB的二进制编码格式

// BSON支持的类型比JSON更丰富:
// - ObjectId:12字节的唯一标识符
// - Date:日期时间
// - Binary Data:二进制数据
// - Code:JavaScript代码
// - Regex:正则表达式
// - Decimal128:高精度小数

// BSON类型示例
{
    "_id": ObjectId("507f1f77bcf86cd799439011"),  // ObjectId类型
    "name": "张三",
    "age": NumberInt(25),          // 32位整数
    "balance": NumberDecimal("100.50"),  // 高精度小数
    "createdAt": ISODate("2024-01-01T00:00:00Z"),  // 日期类型
    "pattern": /^/,              // 正则表达式
    "data": BinData(0, "aGVsbG8=")  // 二进制数据
}

安装MongoDB

Windows安装

powershell
# Windows安装步骤:

# 1. 下载MongoDB安装包
# 访问官网:https://www.mongodb.com/try/download/community
# 选择Windows版本下载

# 2. 运行安装程序
# 双击.msi文件,按向导安装

# 3. 配置环境变量
# 将MongoDB的bin目录添加到系统PATH
# 例如:C:\Program Files\MongoDB\Server\7.0\bin

# 4. 创建数据和日志目录
mkdir C:\data\db
mkdir C:\data\log

# 5. 启动MongoDB服务
# 方式一:命令行启动
mongod --dbpath C:\data\db --logpath C:\data\log\mongodb.log

# 方式二:安装为Windows服务
mongod --install --dbpath C:\data\db --logpath C:\data\log\mongodb.log
net start MongoDB

# 6. 验证安装
mongod --version

Linux安装

bash
# Ubuntu/Debian安装步骤:

# 1. 导入MongoDB公钥
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -

# 2. 添加MongoDB源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# 3. 更新包列表
sudo apt-get update

# 4. 安装MongoDB
sudo apt-get install -y mongodb-org

# 5. 启动MongoDB服务
sudo systemctl start mongod
sudo systemctl enable mongod

# 6. 验证服务状态
sudo systemctl status mongod

# CentOS/RHEL安装步骤:

# 1. 创建yum源文件
sudo cat > /etc/yum.repos.d/mongodb-org-7.0.repo << EOF
[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
EOF

# 2. 安装MongoDB
sudo yum install -y mongodb-org

# 3. 启动服务
sudo systemctl start mongod
sudo systemctl enable mongod

macOS安装

bash
# macOS安装步骤:

# 方式一:使用Homebrew(推荐)
# 1. 更新Homebrew
brew update

# 2. 安装MongoDB
brew tap mongodb/brew
brew install mongodb-community@7.0

# 3. 启动MongoDB服务
brew services start mongodb-community@7.0

# 4. 验证安装
mongod --version

# 方式二:手动安装
# 1. 下载macOS版本的MongoDB
# 2. 解压到目标目录
# 3. 创建数据和日志目录
# 4. 启动MongoDB

Docker安装

bash
# 使用Docker运行MongoDB(推荐用于开发环境)

# 1. 拉取MongoDB镜像
docker pull mongo:7.0

# 2. 运行MongoDB容器
docker run -d \
  --name mongodb \
  -p 27017:27017 \
  -v mongodb_data:/data/db \
  -v mongodb_config:/data/configdb \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password123 \
  mongo:7.0

# 3. 查看容器状态
docker ps

# 4. 进入MongoDB Shell
docker exec -it mongodb mongosh -u admin -p password123

# 5. 停止和启动容器
docker stop mongodb
docker start mongodb

# 使用Docker Compose运行MongoDB
# docker-compose.yml文件内容:
version: '3.8'
services:
  mongodb:
    image: mongo:7.0
    container_name: mongodb
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password123
    volumes:
      - mongodb_data:/data/db
      - mongodb_config:/data/configdb

volumes:
  mongodb_data:
  mongodb_config:

# 启动服务
docker-compose up -d

MongoDB Shell

连接MongoDB

javascript
// 使用mongosh连接MongoDB(MongoDB 5.0+推荐使用mongosh)

// 基本连接(本地默认端口)
mongosh

// 连接指定主机和端口
mongosh --host localhost --port 27017

// 连接指定数据库
mongosh mongodb://localhost:27017/mydb

// 使用用户名密码连接
mongosh mongodb://admin:password123@localhost:27017/admin

// 使用连接字符串
mongosh "mongodb+srv://cluster0.example.com/mydb" --username admin

// 连接成功后的提示
// Current Mongosh Log ID: 65a1b2c3d4e5f6g7h8i9j0k1
// Connecting to: mongodb://127.0.0.1:27017
// Using MongoDB: 7.0.0
// Using Mongosh: 2.0.0

基本Shell操作

javascript
// MongoDB Shell基本操作

// 查看所有数据库
show dbs
// 输出示例:
// admin   40.00 KiB
// config  72.00 KiB
// local   40.00 KiB

// 切换/创建数据库
use mydb
// 输出:switched to db mydb

// 查看当前数据库
db
// 输出:mydb

// 查看当前数据库的所有集合
show collections

// 查看数据库状态
db.stats()

// 查看服务器状态
db.serverStatus()

// 查看MongoDB版本
db.version()

// 退出Shell
exit
// 或
quit()

Shell常用命令

javascript
// MongoDB Shell常用命令

// 1. 帮助命令
help                    // 显示帮助信息
db.help()               // 显示数据库方法帮助
db.collection.help()    // 显示集合方法帮助

// 2. 数据库操作
show dbs                // 显示所有数据库
use dbname              // 切换数据库
db.dropDatabase()       // 删除当前数据库

// 3. 集合操作
show collections        // 显示所有集合
db.createCollection("users")  // 创建集合
db.collection.drop()    // 删除集合

// 4. 文档操作
db.collection.insertOne({})   // 插入一条文档
db.collection.insertMany([{}]) // 插入多条文档
db.collection.find({})        // 查询文档
db.collection.updateOne({}, {}) // 更新一条文档
db.collection.deleteOne({})   // 删除一条文档

// 5. 索引操作
db.collection.getIndexes()    // 查看索引
db.collection.createIndex({}) // 创建索引
db.collection.dropIndex("")   // 删除索引

// 6. 执行JavaScript
// Shell支持执行JavaScript代码
var x = 10;
var y = 20;
print(x + y);  // 输出:30

// 7. 加载外部脚本
load("script.js")

配置文件

mongod.conf配置

yaml
# MongoDB配置文件示例 (mongod.conf)

# 存储配置
storage:
  dbPath: /var/lib/mongodb      # 数据存储路径
  journal:
    enabled: true               # 启用journal日志
  engine: wiredTiger            # 存储引擎

# 日志配置
systemLog:
  destination: file             # 日志输出到文件
  path: /var/log/mongodb/mongod.log  # 日志文件路径
  logAppend: true               # 追加模式
  verbosity: 1                  # 日志级别

# 网络配置
net:
  port: 27017                   # 监听端口
  bindIp: 127.0.0.1,192.168.1.100  # 绑定IP(多个用逗号分隔)
  maxIncomingConnections: 65536  # 最大连接数

# 安全配置
security:
  authorization: enabled        # 启用认证
  keyFile: /etc/mongodb/keyfile  # 集群认证密钥文件

# 复制集配置
replication:
  replSetName: rs0              # 复制集名称
  oplogSizeMB: 1024             # oplog大小

# 分片配置
sharding:
  clusterRole: shardsvr         # 分片角色(shardsvr/configsvr)

# 性能配置
setParameter:
  enableFlowControl: true       # 启用流量控制

启动时指定配置文件

bash
# 使用配置文件启动MongoDB

# Linux/macOS
mongod --config /etc/mongod.conf
# 或
mongod -f /etc/mongod.conf

# Windows
mongod --config "C:\Program Files\MongoDB\Server\7.0\bin\mongod.cfg"

# 以服务方式启动(使用配置文件)
# Linux systemd
sudo systemctl start mongod

# Windows
net start MongoDB

数据模型

文档结构

javascript
// MongoDB文档结构设计

// 1. 扁平结构
{
    "_id": ObjectId("..."),
    "name": "张三",
    "age": 25,
    "email": "zhangsan@example.com"
}

// 2. 嵌套结构(推荐)
{
    "_id": ObjectId("..."),
    "name": {
        "first": "三",
        "last": "张"
    },
    "contact": {
        "email": "zhangsan@example.com",
        "phone": "13800138000"
    },
    "address": {
        "city": "北京",
        "street": "朝阳路",
        "zipCode": "100000"
    }
}

// 3. 数组结构
{
    "_id": ObjectId("..."),
    "name": "张三",
    "hobbies": ["阅读", "编程", "旅游"],  // 简单数组
    "education": [                         // 对象数组
        {
            "school": "清华大学",
            "degree": "本科",
            "year": 2018
        },
        {
            "school": "北京大学",
            "degree": "硕士",
            "year": 2022
        }
    ]
}

// 4. 引用结构(类似关系型外键)
// 用户文档
{
    "_id": ObjectId("user001"),
    "name": "张三"
}

// 订单文档(引用用户)
{
    "_id": ObjectId("order001"),
    "userId": ObjectId("user001"),  // 引用用户ID
    "product": "MacBook Pro",
    "price": 12999
}

嵌套vs引用

javascript
// 选择嵌套还是引用的原则:

// 适合嵌套的场景:
// 1. 一对少关系
// 2. 数据经常一起访问
// 3. 数据量较小
// 4. 数据不需要独立更新

// 用户-地址(一对少,适合嵌套)
{
    "_id": ObjectId("..."),
    "name": "张三",
    "addresses": [
        { "type": "home", "city": "北京" },
        { "type": "work", "city": "上海" }
    ]
}

// 适合引用的场景:
// 1. 一对多/多对多关系
// 2. 数据需要独立访问和更新
// 3. 数据量较大
// 4. 避免数据重复

// 用户-订单(一对多,适合引用)
// 用户文档
{
    "_id": ObjectId("user001"),
    "name": "张三"
}

// 订单文档
{
    "_id": ObjectId("order001"),
    "userId": ObjectId("user001"),
    "product": "MacBook Pro"
}

本章小结

本章介绍了MongoDB的基础知识:

  1. MongoDB概述:了解MongoDB是什么,它的特点和BSON数据格式
  2. 安装配置:掌握在Windows、Linux、macOS和Docker中安装MongoDB的方法
  3. MongoDB Shell:学会使用Shell连接和操作MongoDB
  4. 配置文件:了解mongod.conf的主要配置项
  5. 数据模型:理解文档结构设计和嵌套vs引用的选择

下一章,我们将学习数据库操作,了解如何创建和管理MongoDB数据库。