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")
相关推荐
恒悦sunsite6 小时前
Ubuntu之apt安装ClickHouse数据库
数据库·clickhouse·ubuntu·列式存储·8123
奥尔特星云大使7 小时前
MySQL 慢查询日志slow query log
android·数据库·mysql·adb·慢日志·slow query log
来自宇宙的曹先生7 小时前
MySQL 存储引擎 API
数据库·mysql
间彧7 小时前
MySQL Performance Schema详解与实战应用
数据库
间彧7 小时前
MySQL Exporter采集的关键指标有哪些,如何解读这些指标?
数据库
weixin_446260857 小时前
Django - 让开发变得简单高效的Web框架
前端·数据库·django
mpHH8 小时前
babelfish for postgresql 分析--todo
数据库·postgresql
zizisuo8 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
程序边界9 小时前
国产之光!金仓数据库KingbaseES Oracle兼容性深度体验大赏
数据库·oracle
A阳俊yi10 小时前
Spring——声明式事务
java·数据库·spring