目录
一、MongoDB的介绍
1.概述
a.MongoDB是一个文档型数据库,数据以类似JSON的文档形式存储
b.MongoDB的设计理念是为了应对大数据量、高性能和灵活性需求
c.MongoDB使用集合来组织文档,每个文档都是由键值对组成的
2.主要特点
a.文档导向的存储:MongoDB是一个面向文档的数据库,它以JSON-like的格式存储数据,使得数据结构更加灵活和丰富
b.索引优化查询:MongoDB允许用户为文档中的任意属性创建索引
c.数据镜像与扩展性:通过本地或网络创建数据的副本,MongoDB实现强大的数据冗余
d.水平扩展与分片:面对增加的负载。MongoDB可以通过分片技术将数据分布技术将数据分布到计算机网络中的其它节点上,实现水平扩展
e.强大的查询语言:MongoDB使用JSON格式的查询语法,支持负载的查询表达式,包括对内嵌对象和数组的查询
f.数据更新:利用update()命令,MongoDB能够替换整个文档或更新指定的数据字段,提供了灵活的数据更新方式
g.MapReduce脚本编写:Map和Reduce函数使用Javascript编写,可以通过db.runCommand或mapreduce命令再MongoDB中执行
h.GridFS大文件存储:是MongoDB内置的功能,用于存储和检索大于BSON文档大小限制的文件
i.服务端脚本执行:允许再服务端执行JavaScript脚本,提供直接在服务端执行或存储函数定义以供后续调用的能力
j.多语言支持:提供了对多种编程语言的支持,包括但不限于RUBY、PYHON、JAVA、C++、PHP和C#
3.MongoDB概念解析
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
prmary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
4.完整术语列表
a.文档(Document):MongoDB的基本数据单元,通常是一个JSON-like的结构,可以包含多种数据类型
b.集合(Collection):类似于关系型数据库的表,集合是一组文档的容器。再MongoDB中,一个集合中的文档不需要有一个固定的模式
c.数据库(Database):包含一个或多个集合的MongoDB实例
d.BSON:Binay JSON的缩写,是MongoDB用来存储和传输文档的二进制的JSON
e.索引(INdex):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段床间索引
f.分片(Sharding):一种分布在多个服务器的方法,用于处理大数据集和高吞吐量的应用
g.副本集(Replica Set):一组维护相同数据集的MongoDB服务器,提供数据的冗余备份和高可用性
h.主节点(Proimary):副本集中负责处理所有写入操作的服务器
i.从节点(Secondary):副本集中的服务器,用于读取数据和在主节点故障时接管主节点
j.MongoDB Shell:MongoDB提供的命令行界面,用于与MongoDB实例交互
k.聚合框架(Aggregation Framework):用于执行复杂发数据处理华人聚合操作的一系列操作
l.Map-Reduce:一种编程模型,用于处理大量数据集的并行计算
m.GridFS:用于存储和检索大于BSON文档大小限制的文件的规范
n.ObjectId:MongoDB为每个文档自动生成的唯一标识符
o.GRUD操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)
p.事务(Transactions):从MongoDB4.0开始支持,允许一组操作并作为一个原子单元执行
q.操作符(Operators):用于查询和更新文档的特殊字段
r.连接(Join):MongoDB允许在查询中使用$lookup操作符来实现类似SQL的连接操作
s.TTL(Time-To-Live):可以为集合中的某些字段设置TTL,以自动删除旧数据
t.存储引擎(Storage Engine):MongoDB用于数据存储和管理的底层技术,如WiredTiger和MongoDB的旧存储引擎MMAPv1
u.MongoDB Compass:mongoDB的图形界面工具,用于可视化和管理MongoDB数据
v.MongoDB Atlas:MongoDB提供的云服务,允许在云中托管MongoDB数据库
二、MongDB安装
1.安装依赖包
dnf install -y libcurl openssl tar
2.解压安装
tar zxf mongodb-linux-x86_64-rhel8-8.0.8.tgz
3.将安装包拷贝到指定目录
mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb
4.添加PATH路径
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >>/etc/profile
source /etc/profile
5.创建目录并设置权限
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb
chown `whoami` /var/lib/mongo/
chown `whoami` /var/log/mongodb/
6.编译安装openssl
dnf install -y gcc make perl
tar zxf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl
make && make install
7.设置openssl的环境变量
echo 'export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/openssl11.sh
source /etc/profile.d/openssl11.sh
8.启动MongoDB服务
mongod --dbpath /var/lib/mongo/ --logpath /var/log/mongodb/mongod.log --fork
三、MongoDB Shell
1.安装MongoDB Shell
tar zxf mongosh-2.5.0-linux-x64-openssl3.tgz
cd mongosh-2.5.0-linux-x64-openssl3
cd bin/
cp mongosh /usr/local/bin/
cp mongosh_crypt_v1.so /usr/local/lib
2.验证MongoDB Shell
mongosh
四、数据库管理
1.查看数据库列表
a.查看当前MongoDB实例中所有数据库的列表
show dbs
b.查看当前正在使用的数据库
db
2.创建数据库
use DATABASE_NAME
3.插入数据库
db.数据库名.insertOne({"name":"zhangsan"})
4.删除数据库
use myDatabase
db.dropDatabase()
5.默认数据库
test
6.系统内置数据库
a.admin数据库:存储所有数据库的用户身份信息和全局权限。用户必须通过admin数据库认证后才能执行跨库管理操作
b.config数据库:仅在分片集群环境中存在。存储分片信息、快(chuck)分布、集合分片策略等关键元数据
c.local 数据库:存储当前节点的副本集状态、操作日志(oplog)等本地数据。数据不会被复制到其它节点,仅存在与当前实例
五、集合管理
1.查看集合
show collections
或
show tables
2.创建集合
db.createCollection(name,options)
#name:集合名称
#options:可选参数,指定有关内存大小及索引的选项
例:
test> use runoob
switched to db runoob
runoob> db.runoob.insertOne({"name":"zhangsan"})
{
acknowledged: true,
insertedId: ObjectId('6825475e808ce252b61b2700')
}
3.更新集合名
db.adminCommand({
renameCollection:"sourceDb.sourceCollecion",
to:"targetDb.targetCollecion",
dropTarget:<boolean>
})
#renameCollection:要重命名的集合的完全限定名称(包括数据库名)
#to:目标集合的完全限定名称
#dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合,默认值为false
例:
db.adminCommand({ renameCollection: "test.rundb", to: "test.newrundb" });
4.删除集合
db.collection 名称.drop()
#如果成功删除选定集合,则返回true,失败返回false
例:
db.newrundb.drop()
六、文档操作
1.插入文档
方法 | 用途 | 是否弃用 |
insertOne() | 插入单个文档 | 否 |
insertMany() | 插入多个文档 | 否 |
insert() | 插入单个或多个文档 | 是 |
save() | 插入或更新文档 | 是 |
a.insertOne()
db.collection名称.insertOne(document,options)
#document:要插入的单个文档
#options:一个可选参对象
例:
db.myCollection.insertOne({
name: "Alice",
age: 25,
city: "New York"
});
b.insertMany()
db.collection名称.insertMany(document,options)
#document:要插入的文档数组
#options:一个可选参对象
例:
db.myCollection.insertMany([
{ name: "Bob", age: 30, city: "Los Angeles" },
{ name: "Charlie", age: 35, city: "Chicago" }]);
2.查询文档
a.find()方法
db.collection.find(query,projection)
#query:用于查找文档的查询条件。默认为{},即匹配所有文档
#projection:指定返回结果中包含或排除的字段
例:
db.myCollection.find({ age: { $gt: 25 } });
b.findOne()方法
db.collection.findOne(query,projection)
#query:用于查找文档的查询条件。默认为{},即匹配所有文档
#projection:指定返回结果中包含或排除的字段
3.删除文档
a.deleteOne():匹配过滤器的单个文档
db.collection.deleteOne(filter,options)
#filter:用于查找要删除的文档的查询条件
#options:一个可选参数对象
b.deleteMany():删除所有匹配过滤器的文档
db.collection.deleteMany(filter,options)
#filter:用于查找要删除的文档的查询条件
#options:一个可选参数对象
例:
db.myCollection.deleteMany({ name: "Bob" });
c.findOneAndDelete():查找并删除单个文档,并选择返回删除的文档
db.collection.findOneAndDelete(filter,options)
#filter:用于查找要删除的文档的查询条件
#options:一个可选参数对象
例:
db.myCollection.findOneAndDelete(
{ name: "Charlie" },
{ projection: { name: 1, age: 1 } }
);
4.更新文档
a.插入数据
例:
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"}]);
b.UpdateOne():更新匹配过滤去的单个文档
db.collection.updateOne(filter,update、options)
#filter:用于查找文档的查询条件
#update:指定更新操作的文档或更新操作符
#options:一个可选参数对象
例:
db.myCollection.updateOne(
{ name: "Alice" },
{ $set: { age: 26 } });
c.updateMany():更新所有匹配过滤器的文档
db.collection.updateMany(filter,update、options)
#filter:用于查找文档的查询条件
#update:指定更新操作的文档或更新操作符
#options:一个可选参数对象
例:db.myCollection.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "active" } });
d.replaceOne():替换匹配过滤器的单个文档,新的文档将完全替换旧的文档
db.collection.replaceOne(filter,update、options)
#filter:用于查找文档的查询条件
#update:指定更新操作的文档或更新操作符
#options:一个可选参数对象
例:db.myCollection.replaceOne(
{ name: "Bob" },
{ name: "Bob", age: 31 });
e.findOneAndUpdate():用于查找并更新单个文档,可以选择返回更新前或更新后的文档
db.collection.findOneAndUpdate(filter,update,options)
#filter:用于查找文档的查询条件
#update:指定更新操作的文档或更新操作符
#options:一个可选参数对象
例:
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
3.Mongo数据恢复
mongorestore
八、MongoDB用户管理
1.连接到MongoDB
mongosh
2.切换到目标数据库
use test
3.创建用户
#创建普通用户
db.createUser({
user: "testuser",
pwd: "password123",
roles: [
{ role: "readWrite", db: "test" },
{ role: "dbAdmin", db: "test" }
]})
#创建管理员用户
use admin // 切换到admin数据库(所有管理用户都应该在此数据库创建)
db.createUser({ // 创建用户的命令
user: "admin", // 用户名
pwd: "你的强密码", // 密码(替换为你想要的实际密码)
roles: [ // 分配给用户的权限角色
{ role: "userAdminAnyDatabase", db: "admin" }, // 可以管理所有数据库的用户
"readWriteAnyDatabase" // 可以读写所有数据库
]
})
4.重启服务并开启认证
pkill mongod
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
5.使用testuser用户身份验证
mongosh -u "testuser" -p "password123" --authenticationDatabase "test"
Current Mongosh Log ID: 682559d1ccea165a921b26ff
Connecting to: mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&authSource=test&appName=mongosh+2.5.0
Using MongoDB: 8.0.8
Using Mongosh: 2.5.0
For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/
test> show dbs
test 72.00 KiB
test>