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

MongoDB数据库应用

目录

一:什么是MongoDB

1:主要特点

2:MongoDB概念解析

3:完整术语列表

二:MongoDB安装

三:MongoDB Shell

1:安装MongoDB Shell

2:验证MongoDB Shell

四:数据库管理

1:查看数据库列表

2:创建数据库

3:删除数据库

4:默认数据库

5:系统内置数据库

五:集合管理

1:查看集合

2:创建集合

3:更新集合名

4:删除集合

六:文档操作

1:插入文档

2:查询文档

3:删除文档

4:更新文档

七:MongoDB备份与恢复

1:安装备份与恢复命令

2:MongoDB数据备份和恢复

八:MongoDB用户管理

1:编写配置文件

2:先启用非认证模式

3:登录数据库

4:只能在非认证的情况下删除用户


一:什么是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概念解析

下表将帮助您更容易理解 MongoDB 中的一些概念:

SQL 术语 / 概念MongoDB 术语 / 概念解释 / 说明
databasedatabase数据库
tablecollection数据库表 / 集合
rowdocument数据记录行 / 文档
columnfield数据字段 / 域
indexindex索引
table joins表连接,MongoDB 不支持
primary keyprimary key主键,MongoDB 自动将 id 字段设置为主键

3:完整术语列表

  • 文档(Document):MongoDB 的基本数据单元,通常是一个 JSON - like 的结构,可以包含多种数据类型。
  • 集合(Collection):类似于关系型数据库中的表,集合是一组文档的容器。在 MongoDB 中,一个集合中的文档不需要有一个固定的模式。
  • 数据库(Database):包含一个或多个集合的 MongoDB 实例。
  • BSON:Binary JSON 的缩写,是 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安装

上传软件包

mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
mongodb-linux-x86_64-rhel8-8.0.8.tgz
mongosh-2.5.0-linux-x64-openssl3.tar
openssl-1.1.1w.tar.gz

安装软件包

#安装依赖包
dnf -y install libcurl openssl
#解压安装包
tar zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
#将解压包拷贝到指定目录
mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb
cd /usr/local/mongodb
vim /etc/profileexport PATH=/usr/local/mongodb/bin:$PATH
#启动执行文件
source /etc/profile
#创建目录
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb

编译安装openssl11

#由于mongodb依赖openssl11,需要编译安装openssl11
#安装依赖包
dnf -y install gcc perl
#解压安装包
tar  zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
#编译安装openssl11
./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl
make -j2
make install
#设置openssl11环境变量
cd /opt
cd openssl11/
vim /etc/profileexport LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH
#启动执行文件
source /etc/profile.d/openssl11.sh
#启动mongodb服务
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork##fork:守护进程

三:MongoDB Shell

1:安装MongoDB Shell

#解压安装包
tar zxvf mongosh-2.5.0-linux-x64-openssl3.tar
cd mongosh-2.5.0-linux-x64-openssl3
cd bin/
cp mongosh /usr/local/bin/
cp mongosh_crypt_vl.so /usr/local/bin/

2:验证MongoDB Shell

#验证
mongosh --host <hostname> --port <port>
mongosh

四:数据库管理

1:查看数据库列表

show dbs        //查看当前mongodb中所有数据库的列表
db                        //查看当前正在使用的数据库

2:创建数据库

在 MongoDB 中,数据库的创建是一个简单的过程,当你首次向 MongoDB 中插入数据时,如果数据库不存在,MongoDB 会自动创建它。

我们只需选择一个数据库名称,并开始向其中插入文档即可。

当你使用 use 命令来指定一个数据库时,如果该数据库不存在,MongoDB 将自动创建它。
MongoDB 创建数据库的语法格式如下:
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。

示例:

#创建了数据库 runoob:
test> use runoob
switched to db runoob
runoob> db
runoob
#执行 use runoob 命令后,MongoDB 将创建名为 runoob 的新数据库。此时,你可以开始在这个数据库中创建集合和插入文档。#查看所有数据库,可以使用 show dbs 命令:
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob>

3:删除数据库

如果你需要删除数据库,可以使用 db.dropDatabase () 方法:
use myDatabase
db.dropDatabase ()

上述命令将删除当前正在使用的 myDatabase 数据库及其所有集合。

示例:

runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob 40.00 KiB
runoob> use runoob
already on db runoobtest> db.dropDatabase ()
{ok: 1, dropped: "runoob"}
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB

4:默认数据库

MongoDB 中默认的数据库为 test,如果您没有创建新的数据库,数据将存放在 test 数据库中。

当您通过 shell 连接到 MongoDB 实例时,如果未使用 use 命令切换到其他数据库,则会默认使用 test 数据库。

例如,在启动 MongoDB 实例并连接到 MongoDB shell 后,如果您开始插入文档而未显式指定数据库,MongoDB 将默认使用 test 数据库。

5:系统内置数据库

在 MongoDB 中,admin、config 和 local 是三个特殊的系统内置数据库

  • admin 数据库:存储所有数据库的用户身份信息和全局权限(如 root 用户)。用户必须通过 admin 数据库认证后才能执行跨库管理操作。
  • config 数据库:仅在分片集群环境中存在。存储分片信息、块(chunk)分布、集合分片策略等元数据。
  • local 数据库:存储当前节点的副本集状态、操作日志(oplog)等本地数据。数据不会被复制到其他节点,仅存在于当前实例。

五:集合管理

1:查看集合

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

show collection;

2:创建集合

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

语法格式:

db.createCollection(name, options)

参数说明:

  • name:要创建的集合名称。
  • options:可选参数,指定有关内存大小及索引的选项。

options 可以是如下参数:

参数名类型描述示例值
capped布尔值是否创建一个固定大小的集合。true
size数值集合的最大大小(以字节为单位)。仅在 capped 为 true 时有效。10485760(10MB)
max数值集合中允许的最大文档数。仅在 capped 为 true 时有效。5000
validator对象用于文档验证的表达式。{ $jsonSchema: { ... } }
validationLevel字符串指定文档验证的严格程度。
"off":不进行验证。
"strict":插入和更新操作都必须通过验证 (默认)。
"moderate":仅现有文档更新时必须通过验证,插入新文档时不需要。
"strict"
validationAction字符串指定文档验证失败时的操作。
"error":阻止插入或更新(默认)。
"warn":允许插入或更新,但会发出警告。
"error"
storageEngine对象为集合指定存储引擎配置。{ wiredTiger: { ..} }

3:更新集合名

在 MongoDB 中,不能直接通过命令来重命名集合。MongoDB 可以使用 renameCollection 方法来重命名集合。renameCollection 命令的语法:

renameCollection 命令的语法:
db.adminCommand ({
renameCollection: "sourceDb.sourceCollection",
to: "targetDb.targetCollection",
dropTarget: <boolean>
})

参数说明:

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

4:删除集合

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

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

db.collection 名称.drop ()

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

实例
在数据库 mydb 中,我们可以先通过 show collections 命令查看已存在的集合:

use mydb
switched to db
db.createCollection("kgc")
{ ok: 1 }
mydb>show collections
kgc

六:文档操作

1:插入文档

文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式,BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

常用的插入文档方法包括:

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

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

insertOne()在集合中插入单个文档
语法:db.collection 名称.insertOne({插入单个文档名:"参数",,,})
inserMany()在集合中插入多个文档
语法:db.collection 名称.insertMany([{插入文档数组:"参数",,,},{插入文档数组:"参数",,,}	])

2:查询文档

  • find () 方法

find () 方法以非结构化的方式来显示所有文档。

MongoDB 查询数据的语法格式如下:
db.collection.find (query, projection)

  • query:用于查找文档的查询条件。默认为 {},即匹配所有文档。
  • projection(可选):指定返回结果中包含或排除的字段。

实例

#查找所有文档:
db.myCollection.find ();
#按条件查找文档:
db.myCollection.find ({ age: { $gt: 25 } });说明:
$gt 是 MongoDB 的比较操作符,表示 “大于”(Greater Than)。
这个条件的作用是筛选出 age 字段值大于 25 的文档。#类似的其他比较操作符:
(小于)、gte(大于等于)、$lte(小于等于)
$eq(等于)、$ne(不等于)#按条件查找文档,并只返回指定字段:
db.myCollection.find (
{age: { $gt: 25} },
  • findOne () 方法

findOne () 方法用于查找集合中的单个文档。如果找到多个匹配的文档,它只返回第一个。

语法:
db.collection.findOne (query, projection)

  • query:用于查找文档的查询条件。默认为 {},即匹配所有文档。
  • projection(可选):指定返回结果中包含或排除的字段。
#查找单个文档:
db.myCollection.findOne ({name: "Alice"});#查找单个文档,并只返回指定字段:
db.myCollection.findOne (
{name: "Alice"},
{ name: 1, age: 1, _id: 0 }
);

3:删除文档

  • deleteOne()

deleteOne () 方法用于删除匹配过滤器的单个文档。
语法:
db.collection.deleteOne (filter, options)

  • filter:用于查找要删除的文档的查询条件。
  • options(可选):一个可选参数对象。

实例

db.myCollection.deleteOne ({name: "Alice"});
返回结果:
{
"acknowledged": true,
"deletedCount": 1
}deleteMany()
  • deleteMany()

deleteMany () 方法用于删除所有匹配过滤器的文档。
语法:
db.collection.deleteMany (filter, options)

  • filter:用于查找要删除的文档的查询条件。
  • options(可选):一个可选参数对象。

4:更新文档

在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括 updateOne ()、updateMany ()、replaceOne () 和 findOneAndUpdate ()。插入测试数据:

db.myCollection.insertMany ([{name: "Alice", age: 25, city: "Los Angeles", status: "inactive"}, {name: "Bob", age: 30, city: "Los Angeles", status: "active"}, {name: "Charlie", age: 35, city: "Chicago", status: "active"}]);
  • updateOne()

updateOne () 方法用于更新匹配过滤器的单个文档。

语法:
db.collection.updateOne (filter, update, options)

・filter:用于查找文档的查询条件。
・update:指定更新操作的文档或更新操作符。
・options:可选参数对象,如 upsert、arrayFilters 等。

实例

db.myCollection.updateOne (
{name: "Alice"}, // 过滤条件
{ $set: { age: 26 } }, // 更新操作
{ upsert: false } // 可选参数
);说明:
upsert 选项:
false(默认值):若没有匹配文档,不执行任何操作。
true:若未找到匹配文档,将插入一个新文档(合并查询条件和更新操作的内容)。
例如本案例,不匹配时会插入新文档 {name: "Alice", age: 26}
  • updateMany()

updateMany () 方法用于更新所有匹配过滤器的文档。

语法:
db.collection.updateMany (filter, update, options)

  • filter:用于查找文档的查询条件。
  • update:指定更新操作的文档或更新操作符。
  • options:可选参数对象,如 upsert、arrayFilters 等。

实例

db.myCollection.updateMany (
{ age: { $lt: 30 } }, // 过滤条件
{ $set: {status: "active"} }, // 更新操作
{ upsert: false } // 可选参数
);更新多个文档:
db.myCollection.updateMany (
{ age: { $lt: 30 } },
{ $set: { status: "active" } }
);
  • replaceOne()

replaceOne () 方法用于替换匹配过滤器的单个文档,新的文档将完全替换旧的文档。

语法:
db.collection.replaceOne (filter, replacement, options)

  • filter:用于查找文档的查询条件。
  • replacement:新的文档,将替换旧的文档。
  • options:可选参数对象,如 upsert 等。

实例

db.myCollection.replaceOne (
{name: "Bob"}, // 过滤条件
{ name: "Bob", age: 31 } // 新文档
);替换单个文档:
db.myCollection.replaceOne (
{name: "Bob"},
{ name: "Bob", age: 31 }
);
  • findOneAndUpdate()

findOneAndUpdate () 方法用于查找并更新单个文档,可以选择返回更新前或更新后的文档

语法:
db.collection.findOneAndUpdate (filter, update, options)

・filter:用于查找文档的查询条件。
・update:指定更新操作的文档或更新操作符。
・options:可选参数对象,如 projection、sort、upsert、returnDocument 等。

实例

db.myCollection.findOneAndUpdate (
{name: "Charlie"}, // 过滤条件
{ $set: { age: 36 } }, // 更新操作
{ returnDocument: "after" } // 可选参数,返回更新后的文档
);查找并更新单个文档:
db.myCollection.findOneAndUpdate (
{name: "Charlie"},
{ $set: { age: 36 } },
{ returnDocument: "after" });

七:MongoDB备份与恢复

1:安装备份与恢复命令

#解压安装包
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm

2:MongoDB数据备份和恢复

备份:mongodump
恢复:mongorestore

八:MongoDB用户管理

1:编写配置文件

vim /usr/local/mongodb/mongod.conf
添加参数:

# 系统日志配置
systemLog:destination: filepath: /var/log/mongodb/mongod.loglogAppend: truetimeStampFormat: iso8601-utc# 存储配置
storage:dbPath: /var/lib/mongo# journal选项在8.0+版本已移除,journaling总是启用# 进程管理
processManagement:fork: truepidFilePath: /tmp/mongod.pid# 网络配置
net:bindIp: 127.0.0.1port: 27017# 安全配置
security:authorization: enabled

2:先启用非认证模式

#杀死进程
pkill mongod
#先启用非认证模式
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
#验证登录
mongosh --host localhost --port 27017
mongosh
#创建认证模式的用户和密码
use testdb
db.createUser({user:"zhangsan",pwd:"pwd123",roles:[role:"readWrite",db:"testdb",{role:"read",db:"testdb"}]})
exit

3:登录数据库

#杀死进程
pkill mongod
#启动mongodb服务
mongod -f /usr/local/mongodb/mongod.conf 
或
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
(认证模式)	
#登录数据库
mongosh --host localhost --port 27017 -u "zhangsan" -p "pwd123" --authenticationDatabase "testdb"
#验证
>show collection;

4:只能在非认证的情况下删除用户

#杀死进程
pkill mongod
#先启用非认证模式
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
#登录数据库
mongosh --host localhost --port 27017
mongosh
use testdb
db.dropUser("zhangsan")

http://www.xdnf.cn/news/961363.html

相关文章:

  • AO810 AO810V2 - ABB Ability系统800xA硬件
  • 校园导航系统核心技术解析:高精度定位与 AR 实景导航的应用实践
  • 【动作】AVA:时空定位原子视觉动作视频数据集
  • 【Dv3Admin】系统视图角色菜单按钮权限API文件解析
  • Doris “_stream_load“ 方式批量导入数据
  • Remmina远程访问如何开启本地音频?
  • (41)课60--61高级篇: MySQL体系结构(连接层、服务层、引擎层、存储层)。存储引擎是基于表的,可为不同表指定不同的存储引擎;查询表结构语句 show create table 表名
  • #Word“嵌入式”插图显示不全的解决教程
  • 在Word中使用 Microsoft Print to PDF和另存为PDF两种方式生成的 PDF文件
  • ubuntu24安装TensorRT
  • ubuntu24.04安装IDEA2025.1.2搭建java开发环境
  • 数据结构-链表OJ-回文链表,如何将时间复杂度控制为O(N),空间复杂度控制为O(1)?
  • POI设置Excel单元格背景色
  • DataFrame中.iloc 属性
  • HTAP 技术:融合事务与分析的数据处理新范式
  • 【数据篇】持久化核心:整合 JPA/MyBatis 实现优雅的数据库操作
  • pcie问答--0609
  • 激光隐形切割(Stealth Dicing)技术
  • Oracle数据库对IPv6的支持情况
  • 造成服务器重启的原因都有哪些?
  • Lang*生态系统多个专业框架及他们的作用
  • FTXUI::Dom 模块
  • 足球数据如何驱动 AI 模型进化:从数据采集到智能决策的技术解析
  • PH热榜 | 2025-06-09
  • 小红本批量改写 v1.2.0绿色版
  • 标注工具核心代码解析——def load_image【canvas.py]
  • BeckHoff -->电脑与PLC连接
  • 全微分证明 链式法则 乘法法则 除法法则
  • 基于正点原子阿波罗F429开发板的LWIP应用(6)——SNTP功能和lwiperf测速
  • 第一章 空间解析几何与向量代数 ~ 空间直角坐标系