MongoDB 数据库应用

目录

一、什么是MongoDB

1、主要特点

[2、MongoDB 概念解析](#2、MongoDB 概念解析)

3、完整术语列表

[二、MongoDB 安装与环境配置(Linux 版)](#二、MongoDB 安装与环境配置(Linux 版))

1、系统要求与依赖安装

2、安装步骤

3、初始化目录与权限设置

[4、编译安装 OpenSSL 1.1(可选)](#4、编译安装 OpenSSL 1.1(可选))

5、启动服务

[三、MongoDB Shell 深度使用](#三、MongoDB Shell 深度使用)

[1、Shell 安装与配置](#1、Shell 安装与配置)

2、连接与验证

3、常用操作命令

四、数据库与集合管理

1、数据库操作

2、集合操作

五、文档操作核心指南

1、插入文档

2、查询文档

3、更新文档

4、删除文档

六、数据备份与恢复(mongodump/mongorestore)

1、安装备份工具

2、数据备份

3、数据恢复

七、用户管理与权限控制

1、用户角色体系

2、用户操作指南

一、什么是MongoDB

MongoDB 是一个文档型数据库,数据以类似 JSON 的文档形式存储

MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。

MongoDB 使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。

数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。

集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。

文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row)以 BSON 格式存储。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于JSON 对象,字段值可以包含其他文档,数组及文档数组:

1、主要特点

  • 文档导向的存储:MongoDB 是一个面向文档的数据库,它以JSON-like 的格式存储数据,使得数据结构更加灵活和丰富。
  • 索引优化查询:MongoDB 允许用户为文档中的任意属性创建索引,例如FirstName 和 Address,从而提高查询效率和排序性能。
  • 数据镜像与扩展性:通过本地或网络创建数据的副本,MongoDB 实现了强大的数据冗余和扩展能力。
  • 水平扩展与分片:面对增加的负载,MongoDB 可以通过分片技术将数据分布到计算机网络中的其他节点上,实现水平扩展。
  • 强大的查询语言:MongoDB使用JSON 格式的查询语法,支持复杂的查询表达式,包括对内嵌对象和数组的查询。
  • 数据更新:利用命令update(),MongoDB 能够替换整个文档或更新指定的数据字段,提供了灵活的数据更新方式。
  • MapReduce 批量处理:MongoDB的 MapReduce 功能专为大规模数据处理和聚合操作设计,通过 Map 函数的 emit(key,value)调用和 Reduce 函数的逻辑处理,实现高效的数据汇总。
  • MapReduce 脚本编写:Map 和 Reduce 函数使用 JavaScript 编写,可以通过 db.runCommand或mapreduce命令在 MongoDB 中执行。
  • GridFs 大文件存储:GridFs是 MongoDB 内置的功能,用于存储和检索大于 BSON 文档大小限制的文件,如图片和视频。
  • 服务端脚本执行:MongoDB 允许在服务端执行 JavaScript 脚本,提供了直接在服务端执行或存储函数定义以供后续调用的能力。
  • 多语言支持:MongoDB 提供了对多种编程语言的支持,包括但不限于RUBY、PYTHON、JAVA、C++、PHP 和C#。

2、MongoDB 概念解析

SQL 术语 MongoDB 术语 说明
数据库(Database) 数据库(Database) 存储数据的容器
表(Table) 集合(Collection) 文档的容器,无固定模式
行(Row) 文档(Document) 数据记录,以 BSON 格式存储
列(Column) 字段(Field) 文档中的键值对
索引(Index) 索引(Index) 优化查询性能的数据结构
表连接(Join) 不支持 通过嵌入文档或反规范化处理关联数据
主键(Primary Key) _id 字段 自动生成的唯一标识符

通过下图实例,我们也可以更直观的了解 Mongo 中的一些概念:

3、完整术语列表

  • 文档(Document):MongoDB 的基本数据单元,通常是一个JSON-like 的结构,可以包含多种数据类型。
  • 集合(Collection):类似于关系型数据库中的表,集合是一组文档的容器。在 MongoDB中,一个集合中的文档不需要有一个固定的模式。
  • 数据库(Database):包含一个或多个集合的MongoDB 实例。
  • BSON:BinaryJSON的缩写,是MongoDB用来存储和传输文档的二进制形式的JSON。
  • 索引(Index):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索引。
  • 分片(Sharding):一种分布数据到多个服务器(称为分片)的方法,用于处理大数据集和高吞吐量应用。
  • 副本集(Replica Set):一组维护相同数据集的 MongoDB 服务器,提供数据的冗余备份和高可用性。
  • 主节点(Primary):副本集中负责处理所有写入操作的服务器。
  • 从节点(Secondary):副本集中的服务器,用于读取数据和在主节点故障时接管为主节点。
  • MongoDB Shell:MongoDB 提供的命令行界面,用于与 MongoDB 实例交互。
  • 聚合框架(Aggregation Framework):用于执行复杂的数据处理和聚合操作的一系列操作。
  • Map-Reduce:一种编程模型,用于处理大量数据集的并行计算。
  • GridFs:用于存储和检索大于 BSON 文档大小限制的文件的规范。
  • ObjectId:MongoDB 为每个文档自动生成的唯一标识符。
  • CRUD 操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。
  • 事务(Transactions):从 MongoDB 4.0 开始支持,允许一组操作作为一个原子单元执行。
  • 操作符(Operators):用于查询和更新文档的特殊字段。
  • 连接(Join):MongoDB 允许在查询中使用 $lookup 操作符来实现类似 SQL 的连接操作。
  • TTL(Time-To-Live):可以为集合中的某些字段设置 TTL,以自动删除旧数据。
  • 存储引擎(Storage Engine):MongoDB 用于数据存储和管理的底层技术,如WiredTiger和 MongoDB 的旧存储引擎 MMAPv1。
  • MongoDB Compass:MongoDB 的图形界面工具,用于可视化和管理 MongoDB 数据。
  • MongoDB Atlas:MongoDB 提供的云服务,允许在云中托管 MongoDB 数据库。

二、MongoDB 安装与环境配置(Linux 版)

1、系统要求与依赖安装

  1. 硬件要求

    • 64 位操作系统(推荐 Linux,如 RHEL、Ubuntu)
    • 至少 2GB 内存(生产环境建议 8GB+)
    • 充足的磁盘空间(根据数据量规划)
  2. 依赖包安装

    在 RHEL/CentOS 系统中,需先安装依赖库:

    复制代码
    dnf install libcurl openssl -y

2、安装步骤

  1. 下载安装包

    从 MongoDB 官网下载对应版本的压缩包(以 8.0.8 为例):

    复制代码
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel8-8.0.8.tgz
  2. 解压与移动

    复制代码
    tar zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
    mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb
  3. 配置环境变量

    将 MongoDB 的 bin 目录添加到系统路径:

    复制代码
    echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
    source /etc/profile

3、初始化目录与权限设置

  1. 创建数据与日志目录

    复制代码
    mkdir -p /var/lib/mongo
    mkdir -p /var/log/mongodb
  2. 设置权限

    复制代码
    chown -R $(whoami) /var/lib/mongo
    chown -R $(whoami) /var/log/mongodb

4、编译安装 OpenSSL 1.1(可选)

若系统默认 OpenSSL 版本低于 1.1,需手动编译安装:

复制代码
dnf install -y gcc make perl
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/opt/openssl11 --openssldir=/opt/openssl/ssl
make -j$(nproc)
make install

设置环境变量:

复制代码
echo 'export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH' | tee /etc/profile.d/openssl11.sh
source /etc/profile.d/openssl11.sh

5、启动服务

  1. 前台启动(调试用)

    复制代码
    mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log
  2. 后台启动(生产环境)

    复制代码
    mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

    启动成功后,日志会显示 child process started successfully

三、MongoDB Shell 深度使用

1、Shell 安装与配置

  1. 下载与解压

    复制代码
    wget https://downloads.mongodb.com/compass/mongosh-2.5.0-linux-x64-openssl3.tgz
    tar xzf mongosh-2.5.0-linux-x64-openssl3.tgz
    cd mongosh-2.5.0-linux-x64-openssl3/bin
  2. 复制到系统路径

    复制代码
    cp mongosh /usr/local/bin/
    cp mongosh_crypt_v1.so /usr/local/lib/

2、连接与验证

  1. 默认连接本地数据库

    复制代码
    mongosh

    成功连接后显示 test> 提示符,伴随启动警告(可忽略,生产环境需处理)。

  2. 指定主机与端口连接

    复制代码
    mongosh --host 192.168.1.100 --port 27017

3、常用操作命令

命令 说明
show dbs 查看所有数据库
db 查看当前数据库
use <dbname> 切换或创建数据库
show collections 查看当前库集合
exit 退出 Shell

四、数据库与集合管理

1、数据库操作

  1. 创建数据库

    使用 use <dbname> 命令,若数据库不存在则自动创建,但需插入数据后才会显示在列表中:

    复制代码
    use runoob
    db.runoob.insertOne({ name: "zhangsan" })
  2. 删除数据库

    复制代码
    use mydb
    db.dropDatabase()
  3. 系统内置数据库

    • admin:存储用户权限和全局配置,认证后可执行跨库操作。
    • config:分片集群元数据存储,记录分片信息和块分布。
    • local:存储本地节点数据(如副本集状态、操作日志),不参与复制。

2、集合操作

  1. 创建集合

    显式创建集合并指定选项(如固定大小、验证规则):

    复制代码
    db.createCollection("users", {
      capped: true,
      size: 10485760, // 10MB
      max: 5000,
      validator: {
        $jsonSchema: {
          bsonType: "object",
          required: ["name", "email"],
          properties: {
            name: { bsonType: "string" },
            email: { bsonType: "string", pattern: ".+@.+" }
          }
        }
      },
      validationLevel: "strict"
    })
  2. 重命名集合

    使用 renameCollection 命令,支持跨数据库重命名:

    复制代码
    db.adminCommand({
      renameCollection: "test.old_users",
      to: "production.new_users",
      dropTarget: true // 若目标存在则删除
    })
  3. 删除集合

    复制代码
    db.users.drop() // 永久删除,不可恢复

五、文档操作核心指南

1、插入文档

  1. insertOne() :插入单个文档,返回 insertedId

    复制代码
    db.users.insertOne({
      name: "Alice",
      age: 25,
      city: "New York"
    })
  2. insertMany() :插入多个文档,返回数组形式的 insertedId

    复制代码
    db.users.insertMany([
      { name: "Bob", age: 30, city: "Los Angeles" },
      { name: "Charlie", age: 35, city: "Chicago" }
    ])

2、查询文档

  1. find () 方法

    • 查询所有文档:db.users.find()
    • 条件查询:db.users.find({ age: { $gt: 30 } })
    • 投影控制返回字段:db.users.find({ age: { $gt: 25 } }, { name: 1, age: 1, _id: 0 })
    • 格式化输出:db.users.find().pretty()
  2. findOne () 方法:返回单个匹配文档(首个):

    复制代码
    db.users.findOne({ name: "Alice" })

3、更新文档

  1. updateOne():更新单个匹配文档:

    复制代码
    db.users.updateOne(
      { name: "Alice" },
      { $set: { age: 26, city: "Boston" } },
      { upsert: true } // 若不存在则插入新文档
    )
  2. updateMany():更新所有匹配文档:

    复制代码
    db.users.updateMany(
      { age: { $lt: 30 } },
      { $set: { status: "active" } }
    )
  3. replaceOne():完全替换单个文档:

    复制代码
    db.users.replaceOne(
      { name: "Bob" },
      { name: "Bob", age: 31, city: "San Francisco", status: "inactive" }
    )

4、删除文档

  1. deleteOne():删除单个匹配文档:

    复制代码
    db.users.deleteOne({ name: "Alice" })
  2. deleteMany():删除所有匹配文档:

    复制代码
    db.users.deleteMany({ status: "inactive" })
  3. findOneAndDelete():查找并删除单个文档,返回删除的文档:

    复制代码
    const deletedDoc = db.users.findOneAndDelete({ name: "Charlie" })

六、数据备份与恢复(mongodump/mongorestore)

1、安装备份工具

复制代码
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm

2、数据备份

  1. 备份所有数据库

    复制代码
    mongodump --out /data/backup

    备份文件存储在 /data/backup 目录,每个数据库对应一个子目录。

  2. 备份指定数据库

    复制代码
    mongodump -d test --out /data/backup/test_db
  3. 备份指定集合

    复制代码
    mongodump -d test -c users --out /data/backup/test_users

3、数据恢复

  1. 恢复所有数据库

    复制代码
    mongorestore --dir /data/backup
  2. 恢复指定数据库到新库

    复制代码
    mongorestore -d new_test --dir /data/backup/test
  3. 恢复时删除现有数据

    复制代码
    mongorestore --drop --dir /data/backup/test

七、用户管理与权限控制

1、用户角色体系

MongoDB 的权限系统基于角色(Role)和数据库(Database),核心角色分类:

  1. 数据库用户角色readreadWrite
  2. 数据库管理角色dbAdmindbOwneruserAdmin
  3. 集群管理角色clusterAdminclusterManagerclusterMonitor
  4. 超级用户角色root(包含所有权限)

2、用户操作指南

  1. 创建用户

    testdb 数据库创建具有读写权限的用户:

    复制代码
    use testdb
    db.createUser({
      user: "app_user",
      pwd: "secure_password",
      roles: [{ role: "readWrite", db: "testdb" }]
    })
  2. 认证用户

    复制代码
    db.auth("app_user", "secure_password") // 返回 1 表示认证成功
  3. 启用身份验证

    编辑配置文件 /etc/mongod.conf,添加:

    复制代码
    security:
      authorization: "enabled"

    重启服务使配置生效:

    复制代码
    systemctl restart mongod
  4. 删除用户

    复制代码
    use testdb
    db.dropUser("app_user")
相关推荐
YuTaoShao1 小时前
Java八股文——Spring「Spring 篇」
java·数据库·spring
新知图书2 小时前
扣子数据库实战案例:搭建AI登记助手
数据库·智能体·扣子
麦兜*2 小时前
【Mysql及各种关系型数据库全面对比与深度解析(2025版)】
数据库·sql·mysql·postgresql·oracle·sqlserver·mariadb
扶光与望舒呀3 小时前
mysql 的卸载- Windows 版
数据库·mysql
星垣矩阵架构师3 小时前
架构设计之存储高性能——非关系型数据库(NoSQL)
数据库·架构·nosql
明月看潮生3 小时前
青少年编程与数学 01-011 系统软件简介 16 Redis数据库
数据库·redis·青少年编程·编程与数学
明月看潮生3 小时前
青少年编程与数学 01-011 系统软件简介 15 MongoDB数据库
数据库·mongodb·青少年编程·编程与数学
喵叔哟4 小时前
第7章:Neo4j索引与约束
数据库·oracle·neo4j
Winn~4 小时前
MySQL行锁、记录锁、间隙锁、临建锁、意向锁、表锁
数据库·mysql
snowful world4 小时前
PolyU Palmprint Database掌纹识别数据集预处理(踩坑版)
数据库·人工智能·opencv