当前位置: 首页 > news >正文

MongoDB

目录

一:什么是MongoDB

1:主要特点

2:MongoDB概念解析

3:完整术语列表

二:MongoDB安装

三:MongoDB Shell

1:安装MongoDB Shell

2:验证MongoDB Shell

四:数据库管理

五:集合管理

1:查看集合

2:创建集合

3:更新集合名

4:删除集合

六:文档操作

1:插入文档

2:查询文档

3:删除文档

4:更新文档

七:MongoDB 备份(mongodump)与恢复(mongorestore)

1:安装备份与恢复命令

2:MongoDB数据备份

3:MongoDB数据恢复

八:MongoDB用户管理


一:什么是MongoDB

    MongoDB 是一个文档型数据库,数据以类似JSON 的文档形式存储。MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。MongoDB 使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成
的。

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

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

1:主要特点

特性类别具体描述
文档导向的存储以JSON-like格式存储数据,支持灵活和丰富的数据结构。
索引优化查询允许为任意属性(如FirstName、Address)创建索引,提升查询效率和排序性能。
数据镜像与扩展性通过本地或网络创建数据副本,实现数据冗余和扩展能力。
水平扩展与分片通过分片技术将数据分布到多个节点,支持水平扩展以应对高负载。
强大的查询语言使用JSON格式的查询语法,支持复杂查询(包括内嵌对象和数组)。
数据更新通过update()命令替换整个文档或更新指定字段,提供灵活的数据更新方式。
MapReduce批量处理专为大规模数据处理设计,通过Map函数的emit(key, value)和Reduce函数实现高效数据汇总。
MapReduce脚本编写Map和Reduce函数用JavaScript编写,可通过db.runCommandmapreduce命令执行。
GridFS大文件存储内置功能,用于存储和检索超过BSON文档大小限制的文件(如图片、视频)。
服务端脚本执行支持在服务端执行JavaScript脚本,可直接执行或存储函数定义供后续调用。
多语言支持提供多种编程语言支持,包括RUBY、PYTHON、JAVA、C++、PHP、C#等。

2:MongoDB概念解析

SQL 术语/概念MongoDB 术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表(SQL) / 集合(MongoDB)
rowdocument数据记录行(SQL) / 文档(MongoDB),MongoDB 使用 JSON-like 格式存储文档
columnfield数据字段(SQL) / 域(MongoDB)
indexindex索引,用于加速查询
table joins表连接(SQL),MongoDB 不支持连接操作,需通过嵌入文档或应用层逻辑实现
primary keyprimary key主键(SQL),MongoDB 自动将 _id 字段设置为主键

3:完整术语列表

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

二:MongoDB安装

# 安装依赖包
dnf install libcurl openssl -y# 解压安装包
tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz# 移动安装文件
mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb# 配置环境变量
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile

创建数据库目录

默认情况下 MongoDB 启动后会初始化以下两个目录:

数据存储目录:/var/lib/mongodb

日志文件目录:/var/log/mongodb

# 创建数据目录并设置权限
[root@localhost ~]# mkdir -p /var/lib/mongo
[root@localhost ~]# mkdir -p /var/log/mongodb
[root@localhost ~]# chown `whoami` /var/lib/mongo  # 设置权限
[root@localhost ~]# chown `whoami` /var/log/mongodb  # 设置权限# 安装OpenSSL依赖
[root@localhost ~]# dnf install -y gcc make perl
[root@localhost ~]# tar xzf openssl-1.1.1w.tar.gz
[root@localhost ~]# cd openssl-1.1.1w
[root@sentinel01 openssl-1.1.1w]# ./config --prefix=/opt/openssl --openssldir=/opt/openssl/ssl
[root@sentinel01 openssl-1.1.1w]# make -j$(nproc)
[root@sentinel01 openssl-1.1.1w]# make install# 设置OpenSSL环境变量
[root@localhost ~]# echo 'export LD_LIBRARY_PATH=/opt/openssl/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/openssl.sh
[root@localhost ~]# source /etc/profile.d/openssl.sh# 启动MongoDB服务
[root@localhost ~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork# 成功启动输出示例
about to fork child process, waiting until server is ready for connections.
forked process: 12102
child process started successfully, parent exiting

三:MongoDB Shell

    MongoDB Shell 是 MongoDB 提供的官方交互式界面,允许用户与 MongoDB 数据库进行交互、执行命令和操作数据库。

    MongoDB Shell 是基于 JavaScript 的,允许用户直接在命令行或者脚本中使用 JavaScript 语言来操作 MongoDB 数据库。

1:安装MongoDB Shell

# 解压安装包
[root@localhost ~]# tar xzf mongosh-2.5.0-linux-x64-openssl3.tgz# 进入解压目录
[root@localhost ~]# cd mongosh-2.5.0-linux-x64-openssl3
[root@localhost mongosh-2.5.0-linux-x64-openssl3]# cd bin/# 复制文件到系统目录
[root@localhost bin]# cp mongosh /usr/local/bin/
[root@localhost bin]# cp mongosh_crypt_v1.so /usr/local/lib/

2:验证MongoDB Shell

# 连接MongoDB服务器
mongosh --host <hostname> --port <port>

说明:

  • - mongosh: 启动 MongoDB Shell 命令行工具。
  • - --host <hostname>: 指定 MongoDB 服务器的主机名或 IP 地址。
  •   - <hostname>: MongoDB 服务器的主机名(如 localhost)或 IP 地址(如 127.0.0.1)。
  • - --port <port>: 指定 MongoDB 服务器的端口号。
  •   - <port>: MongoDB 服务器监听的端口号,默认端口是 27017。

四:数据库管理

操作类型命令/方法说明示例
查看数据库列表show dbs显示当前MongoDB实例中所有非空数据库(系统库默认显示)> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
查看当前数据库db显示当前正在使用的数据库> db
runoob
创建数据库use DATABASE_NAME切换到指定数据库,若不存在则自动创建(需插入数据后才会显示)> use mydb
> db.coll.insertOne({name: "Alice"})
删除数据库db.dropDatabase()删除当前数据库及其所有集合(需先切换到目标数据库)> use mydb
> db.dropDatabase()
{ ok: 1, dropped: 'mydb' }
默认数据库test未指定数据库时,MongoDB默认使用test数据库存储数据> db.coll.insertOne({x: 1}) // 默认存入test
系统内置数据库admin存储用户权限和全局管理信息(如创建用户、集群配置)> use admin
> db.createUser(...)
config仅在分片集群中存在,存储分片元数据(如分片键、块分布)> use config
> db.shards.find()
local存储副本集状态和操作日志(oplog),数据不复制到其他节点> use local
> db.oplog.rs.find()

五:集合管理

1:查看集合

查看当前库已有集合,可以使用show collections 或show tables命令

2:创建集合

MongoDB 中使用 `createCollection()` 方法来创建集合。

语法格式:

db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称(字符串类型,必填)
  • options: 可选参数,指定有关内存大小及索引的选项(文档类型)

options 可以是如下参数:

参数名类型描述示例值
capped布尔值是否创建固定大小的集合(循环覆盖旧数据)true
size数值集合的最大字节大小(仅在capped为true时有效)10485760 (10MB)
max数值集合允许的最大文档数(仅在capped为true时有效)5000
validator对象文档验证规则(使用JSON Schema语法){ $jsonSchema: { bsonType: "object", required: ["name"] } }
validationLevel字符串验证严格程度:
"off": 不验证
"strict": 插入和更新都验证(默认)
"moderate": 仅更新时验证
"strict"
validationAction字符串验证失败时的处理:
"error": 拒绝操作(默认)
"warn": 允许但记录警告
"error"
storageEngine对象指定存储引擎配置{ wiredTiger: { configString: "block_compressor=zstd" } }
collation对象指定字符串排序规则(如语言、大小写敏感等){ locale: "en", strength: 2 }

在插入文档时,MongoDB 首先检查固定集合的 size字段,然后检査 max 字段。

使用这些选项创建一个集合的实例:

> db.createCollection("myComplexCollection", {capped: true,                       // 固定集合size: 10485760,                     // 大小限制(10MB)max: 5000,                          // 文档数量限制validator: {                        // 文档验证规则$jsonSchema: {bsonType: "object",required: ["name", "email"],properties: {name: {bsonType: "string",description: "必须为字符串且为必填项"},email: {bsonType: "string",pattern: ".+@.+$",  // 邮箱格式验证description: "必须为有效的电子邮件地址"}}}},validationLevel: "strict",          // 严格验证级别validationAction: "error",          // 验证失败时抛出错误storageEngine: {                    // 存储引擎配置wiredTiger: { configString: "block_compressor=zstd" }},collation: {                        // 排序规则locale: "en", strength: 2 }
});

这个例子创建了一个集合,具有以下特性:

固定大小,最大 10MB,最多存储 5000个文档。

文档必须包含必须是字符串,email必须是有效和email 字段,其中namename的电子邮件格式。
验证级别为严格,验证失败将阻止插入或更新。
使用 WiredTiger 存储引擎,指定块压缩器为 zstd。
默认使用英语排序规则。

实例

在 test 数据库中创建 runoob 集合:

> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }

注意: 在 MongoDB 中,集合只有在内容插入后才会创建,就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

3:更新集合名

在 MongoDB 中,不能直接通过命令来重命名集合。

MongoDB 可以使用 renameCollection 方法来来重命名集合。

// MongoDB 集合重命名命令语法
> db.adminCommand({renameCollection: "sourceDb.sourceCollection",  // 原集合全名(数据库.集合)to: "targetDb.targetCollection",               // 目标集合全名dropTarget: <boolean>                          // 是否覆盖目标集合(true/false)
})

参数说明:

  • renameCollection:要重命名的集合的完全限定名称(包括数据库名)。
  • to:目标集合的完全限定名称(包括数据库名)。
  • dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合。默认值为false。

4:删除集合

MongoDB 中使用 drop()方法来删除集合。

drop()方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作,因此需要谨慎使用。

语法格式:

db.collection 名称.drop()

如果成功删除选定集合,则 drop()方法返回 true,否则返回 false。

六:文档操作

1:插入文档

常用的插入文档方法
方法用途是否弃用
insertOne()插入单个文档
insertMany()插入多个文档
insert()插入单个或多个文档
save()插入或更新文档

    在 MongoDB 中,插入文档时如果集合(Collection)不存在,数据库会自动创建该集合。这是 MongoDB 的默认行为,也是其无模式设计(Schema-less)的核心特性之一

2:查询文档

方法语法格式返回结果查询条件字段投影使用场景
find()db.collection.find(query, projection)返回游标对象(可迭代)可选,默认为{}(匹配所有文档)可选,控制返回字段需要获取多个匹配文档时使用
findOne()db.collection.findOne(query, projection)返回单个文档/null可选,默认为{}(匹配所有文档)可选,控制返回字段只需获取第一个匹配文档时使用

3:删除文档

方法语法格式功能描述返回值使用场景
deleteOne()db.collection.deleteOne(filter, options)删除第一个匹配的文档{acknowledged: bool, deletedCount: number}精确删除单个文档(如按ID删除)
deleteMany()db.collection.deleteMany(filter, options)删除所有匹配的文档{acknowledged: bool, deletedCount: number}批量清理数据(如过期日志删除)
findOneAndDelete()db.collection.findOneAndDelete(filter, options)查找并删除一个文档,可返回被删文档被删除的文档(或null)需要记录被删内容的场景

4:更新文档

方法语法格式功能描述返回值核心特点
updateOne()db.collection.updateOne(filter, update, options)更新第一个匹配的文档{acknowledged: bool, matchedCount: number, modifiedCount: number}支持操作符($set等),可配置upsert
updateMany()db.collection.updateMany(filter, update, options)更新所有匹配的文档{acknowledged: bool, matchedCount: number, modifiedCount: number}批量更新,支持相同操作符
replaceOne()db.collection.replaceOne(filter, replacement, options)完全替换匹配的第一个文档{acknowledged: bool, matchedCount: number, modifiedCount: number}替换整个文档(非字段级更新)
findOneAndUpdate()db.collection.findOneAndUpdate(filter, update, options)查找并更新一个文档,可返回文档默认返回更新前的文档(可配置返回更新后)支持排序/投影等高级选项

七:MongoDB 备份(mongodump)与恢复(mongorestore)

1:安装备份与恢复命令

[root@localhost ~]# rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm

2:MongoDB数据备份

mongodump -h dbhost -d dbname -o dbdirectory
  • -h:MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1 :27017
  • -d:需要备份的数据库实例,例如:test
  • -o:备份的数据存放位置,例如:/data/dump,当然该目录需要提前建立,在备份完成后,系统自动在 dump 目录下建立一个 test 目录,这个目录里面存放该数据库实例的备份数据。
[root@localhost ~]#mongodump

mongodump 命令可选参数列表如下所示:

语法描述实例
mongodump --host HOST_NAME --port PORT_NUMBER备份所有MongoDB数据mongodump --host runoob.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY从指定数据目录备份mongodump --dbpath /data/db/ --out /data/backup/
mongodump --collection COLLECTION --db DB_NAME备份指定数据库的集合mongodump --collection mycol --db test

3:MongoDB数据恢复

mongodb 使用 mongorestore 命令来恢复备份的数据。

> mongorestore -h <hostname>:<port> -d dbname <path>

  • --host  <:port>,-h <:port>: MongoDB所在服务器地址,默认为:localhost:27017
  • --db ,-d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如 test2
  • --drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
  • <path>:mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你不能同时指定<path〉和 --dir 选项,--dir 也可以设置备份目录。
  • --dir:指定备份的目录,你不能同时指定<path>和--dir 选项
[root@localhost ~]# mongorestore

mongorestore默认会从当前执行命令的路径下的dump目录中读取备份数据

八:MongoDB用户管理

# 连接MongoDB
mongosh# 切换数据库
use test# 创建用户
db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "test" },  // 读写权限{ role: "dbAdmin", db: "test" }     // 数据库管理权限]
})# 验证用户
db.auth("testuser", "password123")  // 返回1表示成功# 启用认证(二选一)
# 方法1: 修改配置文件
security:authorization: "enabled"# 方法2: 启动时加参数
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork# 认证登录
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "test"# 删除用户
db.dropUser("testuser")
http://www.lqws.cn/news/534907.html

相关文章:

  • jupyter notebook Kernel Restarting内核崩溃的解决
  • Linux命令与脚本:高效系统管理的双刃剑
  • 用户中心配置(资源、角色、用户配置)
  • 机器学习在智能农业中的创新应用与未来趋势
  • 【javascript】this关键字
  • vue + vue-router写登陆验证的同步方法和异步方法,及页面组件的分离和后端代码
  • Unity Netcode自定义数据传输——结构体及其序列化
  • .NET测试工具Parasoft dotTEST内置安全标准,编码合规更高效
  • 基于STM32的智能书房系统的设计
  • SpringBoot定时任务 - Timer实现方式
  • 算法打卡 day4
  • 大数据赋能智慧城市:从数据洪流到科学规划的“智慧之匙”
  • Leetcode百题斩-DP
  • 全面学习 OpenAI API:从 Python 教程到 API Key 使用详解,快速上手调用和部署
  • 微服务分布式事务解决方案
  • Beam2.61.0版本消费kafka重复问题排查
  • Git 使用规范与命令使用场景详解
  • 【Excel数据分析】花垣县事业单位出成绩了,用Excel自带的M语言做一个数据分析
  • 45. 跳跃游戏 II
  • uniapp 和原生插件交互
  • Sentinel 授权规则详解与自定义异常处理
  • Tailwind CSS 尺寸控制
  • c++多线程编程
  • 《聊一聊ZXDoc》之汽车标定、台架标定、三高标定
  • 基于定制开发开源AI智能名片S2B2C商城小程序源码的H5游戏开发模式创新研究
  • 从零开始的云计算生活——第二十四天,重起航帆,初见MySQL数据库
  • 智能体决策框架对决:ReAct极速响应 vs Plan-and-Execute稳控全局
  • 【全志V821_FoxPi】3-2 Linux 5.4 SPI + XPT2046触摸(ADS7846) + tslib
  • SQL SERVER存储过程
  • 分享一些实用的PHP函数(对比js/ts实现)