Mongodb数据库应用

目录

什么是mongodb

主要特点

MongoDB 概念解析

完整术语列表

MongoDB 安装

MongoDB Shell

安装 MongoDB Shell

验证 MongoDB Shell

数据库管理

查看数据库列表

创建数据库

实例

删除数据库

实例

默认数据库

系统内置数据库

集合管理

查看集合

创建集合

实例

更新集合名

renameCollection 命令的语法:

参数说明:

实例

删除聚合

语法格式:

实例

文档操作

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

insertOne()

参数说明:

实例

insertMany()

参数说明:

实例

查询文档

find () 方法

参数说明:

查找所有文档:

说明:

说明:

findOne () 方法

除文档删

deleteOne()

deleteMany()

语法:

实例

findOneAndDelete()

语法:

实例

更新文档

updateOne()

语法:

实例

updateMany()

语法:

实例

replaceOne()

语法:

实例

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

安装备份与恢复命令

 MongoDB 数据备份

MongoDB 数据恢复

MongoDB 用户管理

连接到 MongoDB

 切换到目标数据库

创建用户

验证用户

启用身份验证

使用用户身份登录

删除用户

实例操作

什么是mongodb

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

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

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

主要特点

  • 文档导向的存储: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#。

MongoDB 概念解析

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

完整术语列表

文档(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 的安装过程简单直观,便于用户快速部署和使用。MongoDB 提供了 linux 各个发行版本 64 位的安装包,你可以在官网下载安装包。

安装前我们需要安装各个 Linux 平台依赖包

dnf install libcurl openssl -y

解压安装包

ar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz

将解压包拷贝到指定目录

mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb

MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:

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  # 设置权限

由于 mongodb 依赖 openssl11,需要编译安装 openssl11

[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/openssl11 --openssldir=/opt/openssl11/ssl
[root@sentinel01 openssl-1.1.1w]#make -j$(nproc)
[root@sentinel01 openssl-1.1.1w]#make install

接下来启动 Mongodb 服务:

[root@localhost ~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

看到以下信息,说明启动成功。

MongoDB Shell

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

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

安装 MongoDB Shell

解压安装包,将 bin 目录中 mongosh 二进制文件复制到 PATH 变量中列出的目录中,例如 /usr/local/bin:

[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/

验证 MongoDB Shell

打开你的终端并使用 mongosh 命令连接到 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。

输入 mongosh 默认连接本地 mongodb 数据库,看到以下信息说明登录成功,warnings 警告为优化提醒,可以暂时忽略,如若生产环境部署需要处理

plaintext

[root@sentinel01 bin]# mongosh
Current Mongosh Log ID: 680a1533277aa1c07b1b26ff
Connecting to:        mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.0
Using MongoDB:        8.0.8
Using Mongosh:        2.5.0For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/The server generated these startup warnings when booting
2025-04-24T18:22:55.898280+08:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prod-notes-filesystem
2025-04-24T18:22:55.898280+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2025-04-24T18:22:55.898280+08:00: You are running this process as the root user, which is not recommended2025-04-24T18:22:55.898280+08:00: This server is bound to localhost. Remote systems will be unable to connect to this server. Start the server with --bind_ip <address> to specify which IP addresses it should serve responses from, or with --bind_ip_all to bind to all interfaces. If this behavior is desired, start the server with --bind_ip 127.0.0.1 to disable this warning
2025-04-24T18:22:55.898280+08:00: Soft rlimits too low
2025-04-24T18:22:55.898280+08:00: For customers running the database memory allocator we suggest changing the contents of the following sysctl file
2025-04-24T18:22:55.898280+08:00: We suggest setting the contents of /proc/sys/vm/zone_reclaim_mode to 0 or 1, as a
wapping can cause performance problems.test>

数据库管理

查看数据库列表

要查看当前 MongoDB 实例中所有数据库的列表,可以使用 show dbs 命令:

> show dbs

要查看当前正在使用的数据库,可以使用 db 命令:

> db

创建数据库

在 MongoDB 中,数据库的创建是一个简单的过程,当你首次向 MongoDB 中插入数据时,如果数据库不存在,MongoDB 会自动创建它。
我们只需选择一个数据库名称,并开始向其中插入文档即可。

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

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

实例

以下实例我们创建了数据库 runoob:

test> use runoob
switched to db runoob
runoob> db
runoob
runoob>

执行 use runoob 命令后,MongoDB 将创建名为 runoob 的新数据库。此时,你可以开始在这个数据库中创建集合和插入文档。

如果你想查看所有数据库,可以使用 show dbs 命令:

runoob> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
runoob>

可以看到,我们刚创建的数据库 runoob 并不在数据库的列表中,要显示它,我们需要向 runoob 数据库插入一些数据。

runoob> db.runoob.insertOne({"name":"zhangsan"})
{acknowledged: true,insertedId: ObjectId('680a18f4277aa1c07b1b2700')
}
runoob> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
runoob  40.00 KiB
runoob>

删除数据库

如果你需要删除数据库,可以使用 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 runoob
test> db.dropDatabase()
{ ok: 1, dropped: 'runoob' }
runoob> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB

默认数据库

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

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

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

系统内置数据库

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

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

集合管理

查看集合

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

> show collections

创建集合

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: { ... } }
collation对象指定集合的默认排序规则。{ locale: "en", strength: 2 }

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

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

db.createCollection("myComplexCollection", {capped: true,size: 10485760,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 个文档。
文档必须包含 name 和 email 字段,其中 name 必须是字符串,email 必须是有效的电子邮件格式。
验证级别为严格,验证失败将阻止插入或更新。
使用 WiredTiger 存储引擎,指定块压缩器为 zstd。
默认使用英语排序规则。

实例

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

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

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

更新集合名

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

renameCollection 命令的语法:
db.adminCommand({renameCollection: "sourceDb.sourceCollection",to: "targetDb.targetCollection",dropTarget: <boolean>
})
参数说明:
  • renameCollection:要重命名的集合的完全限定名称(包括数据库名)。
  • to:目标集合的完全限定名称(包括数据库名)。
  • dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合。默认值为 false
实例

假设你要将 test 数据库中的 oldCollection 重命名为 newCollection,可以按以下步骤进行:

确保已连接到 test 数据库

use test

运行 renameCollection 命令

db.adminCommand({renameCollection: "test.oldCollection",to: "test.newCollection" });

如果你要将集合重命名到另一个数据库,例如将 test 数据库中的 oldCollection 重命名为 production 数据库中的 newCollection,可以这样做:

db.adminCommand({renameCollection: "test.oldCollection",to: "production.newCollection" });

删除聚合

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

接着删除集合 kgc :

>db.kgc.drop()
true

通过 show collections 再次查看数据库 mydb 中的集合:

>show collections

从结果中可以看出 kgc 集合已被删除。

文档操作

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

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

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

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

insertOne()

insertOne() 方法用于在集合中插入单个文档。

db.collection名称.insertOne(document, options)

参数说明

  • document:要插入的单个文档。
  • options(可选):一个可选参数对象,可以包含 writeConcern 和 bypassDocumentValidation 等。
实例
db.myCollection.insertOne({name: "Alice",age: 25,city: "New York"
});

返回结果

{"acknowledged": true,"insertedId": ObjectId("60c72b2f9b1d8b5af8e2b2d")
}

insertMany()

insertMany() 方法用于在集合中插入多个文档。

db.collection.insertMany(documents, options)

参数说明

  • documents:要插入的文档数组。
  • options(可选):一个可选参数对象,可以包含 orderedwriteConcern 和 bypassDocumentValidation 等。
实例

插入多个文档的示例(示例未完整展示 )。

db.myCollection.insertMany([{ name: "Bob", age: 30, city: "Los Angeles" },// 可继续添加更多文档...
]);

返回结果:

{"acknowledged": true,"insertedIds": [ObjectId("60c72b2f9b1d8b5af8e2b2e"),ObjectId("60c72b2f9b1d8b5af8e2b2f")]
}

查询文档

MongoDB 查询文档使用 find()findOne() 方法。

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 的文档。

类似的其他比较操作符

  • $gt(大于)、$lt(小于)、$gte(大于等于)、$lte(小于等于)
  • $eq(等于)、$ne(不等于)

按条件查找文档,并只返回指定字段:

实例

db.myCollection.find({ age: { $gt: 25 } },{ name: 1, age: 1, _id: 0 }
);

说明:

{ name: 1, age: 1, _id: 0 } - 投影(Projection)
用于控制返回的字段(类似 SQL 中的 SELECT 语句):1 表示包含该字段,0 表示排除该字段。例如 _id: 0 表示排除默认返回的 _id 字段。所以最终返回的文档仅包含 name 和 age 字段。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

>db.myCollection.find().pretty()

pretty() 方法以格式化的方式来显示所有文档。

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 }
);

除文档删

常用的删除文档方法包括 deleteOne()deleteMany() 以及 findOneAndDelete()

deleteOne()

deleteOne() 方法用于删除匹配过滤器的单个文档。

语法

db.myCollection.findOne({ name: "Alice" });

参数说明

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

实例

db.collection.deleteOne(filter, options)

返回结果:

{"acknowledged": true,"deletedCount": 1
}

deleteMany()

deleteMany() 方法用于删除所有匹配过滤器的文档。

语法

db.collection.deleteMany(filter, options)
  • filter:用于查找要删除的文档的查询条件。
  • options(可选):一个可选参数对象。
实例
db.myCollection.deleteMany({ name: "Bob" });

返回结果

{"acknowledged": true,"deletedCount": 1
}

findOneAndDelete()

findOneAndDelete() 方法用于查找并删除单个文档,并可以选择返回删除的文档。

语法

db.collection.findOneAndDelete(filter, options)
  • filter:用于查找要删除的文档的查询条件。
  • options:可选参数对象,如 projectionsort 等。
实例
db.myCollection.findOneAndDelete({ name: "Charlie" },{ projection: { name: 1, age: 1 } }
);

findOneAndDelete 返回被删除的文档,如果找不到匹配的文档,则返回 null

更新文档

在 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:可选参数对象,如 upsertarrayFilters 等。
实例
db.myCollection.updateOne({ name: "Alice",        // 过滤条件age: { $ne: 26 }      // 过滤条件},  { $set: { age: 26 } },   // 更新操作{ upsert: false }        // 可选参数
);

upsert 选项:

  • false(默认值):若没有匹配文档,不执行任何操作。
  • true:若未找到匹配文档,将插入一个新文档(合并查询条件和更新操作的内容)。
    例如本案例,不匹配时会插入新文档 { name: "Alice", age: 26 }

更新单个文档:

db.myCollection.updateOne({ name: "Alice" },{ $set: { age: 28 } }
);

updateMany()

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

语法

db.collection.updateMany(filter, update, options)

参数说明

  • filter:用于查找文档的查询条件。
  • update:指定更新操作的文档或更新操作符。
  • options:可选参数对象,如 upsertarrayFilters 等。
实例
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.findOneAndUpdate({ name: "Charlie" },          // 过滤条件{ $set: { age: 30 } },        // 更新操作{ returnDocument: "after" }   // 可选参数,返回更新后的文档
);

查找并更新单个文档

db.myCollection.findOneAndUpdate({ name: "Charlie" },{ $set: { age: 30 } },{ returnDocument: "after" }
);

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

安装备份与恢复命令

[root@localhost ~]# rpm -ivh mongodb-database-tools-rhel8-x86_64-100.6.0.rpm

 MongoDB 数据备份

在 MongoDB 中使用 mongodump 命令来备份数据,该命令可导出所有数据到指定目录中。

mongodump 命令可通过参数指定导出的数据所属的服务器。

 mongodump 命令的基本语法:

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

执行 mongodump 命令后,客户端会连接到 ip 为 127.0.0.1、端口号为 27017 的 MongoDB 服务上,并备份所有数据到命令执行所在目录下的 dump/ 目录中

[root@localhost ~]# mongodump
2025-04-25T22:44:21.307+0800    writing admin.system.version to dump/admin/system.version.bson
2025-04-25T22:44:21.307+0800    done dumping admin.system.version (1 document)
2025-04-25T22:44:21.308+0800    writing mydb.myCollection to dump/mydb/myCollection.bson
2025-04-25T22:44:21.308+0800    writing test.myComplexCollection to dump/test/myComplexCollection.bson
2025-04-25T22:44:21.310+0800    writing test.myCollection to dump/test/myCollection.bson
2025-04-25T22:44:21.313+0800    done dumping test.myCollection (3 documents)
2025-04-25T22:44:21.313+0800    done dumping test.myComplexCollection (0 documents)
2025-04-25T22:44:21.334+0800    done dumping mydb.myCollection (3 documents)
[root@localhost ~]# ls
dump

mongodump 命令可选参数列表

语法描述实例(部分显示)
mongodump --host HOST_NAME --port PORT_NUMBER备份所有 MongoDB 数据mongodump --host runoob.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY(描述未完整显示 )mongodump --dbpa...
mongodump --collection COLLECTION --db DB_NAME备份指定数据库的集合mongodump --collection mycol -d test

MongoDB 数据恢复

MongoDB 使用 mongorestore 命令恢复备份数据,

 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 ),不能与 --dir 同时用。
  • --dir:指定备份目录,不能与 <path> 同时用。

执行以下命令:

[root@localhost ~]# mongorestore

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

执行以上命令输出结果如下:

[root@localhost ~]# mongorestore
2025-04-25T22:50:28.111+0800    using default 'dump' directory
2025-04-25T22:50:28.111+0800    preparing collections to restore from
2025-04-25T22:50:28.111+0800    don't know what to do with file "dump/prelude.json", skipping...
2025-04-25T22:50:28.111+0800    reading metadata for mydb.myCollection from dump/mydb/myCollection.metadata.json
2025-04-25T22:50:28.111+0800    reading metadata for test.myCollection from dump/test/myCollection.metadata.json
2025-04-25T22:50:28.111+0800    reading metadata for test.myComplexCollection from dump/test/myComplexCollection.metadata.json
2025-04-25T22:50:28.125+0800    restoring test.myCollection from dump/test/myCollection.bson
2025-04-25T22:50:28.134+0800    restoring mydb.myCollection from dump/mydb/myCollection.bson
2025-04-25T22:50:28.136+0800    finished restoring test.myCollection (3 documents, 0 failures)
2025-04-25T22:50:28.140+0800    restoring test.myComplexCollection from dump/test/myComplexCollection.bson
2025-04-25T22:50:28.148+0800    finished restoring mydb.myCollection (3 documents, 0 failures)
2025-04-25T22:50:28.151+0800    finished restoring test.myComplexCollection (0 documents)
2025-04-25T22:50:28.151+0800    no indexes to restore for collection mydb.myCollection
2025-04-25T22:50:28.151+0800    no indexes to restore for collection test.myCollection
2025-04-25T22:50:28.151+0800    no indexes to restore for collection test.myComplexCollection
2025-04-25T22:50:28.151+0800    6 document(s) restored successfully. 0 document(s) failed to restore.

MongoDB 用户管理

在 MongoDB 中进行用户管理涉及用户的创建、分配角色、认证和登录等操作。以下是使用 MongoDB Shell(mongosh )进行用户管理的详细说明,包括创建用户、分配角色、认证和登录的具体步骤。

连接到 MongoDB

mongosh

 切换到目标数据库

use test

创建用户

使用 db.createUser 命令创建用户并分配角色。
示例:创建名为 testuser、密码为 password123 的用户,赋予 readWrite 和 dbAdmin 角色(需替换 <database_name> 为实际数据库名 )。

db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "<database_name>" },{ role: "dbAdmin", db: "<database_name>" }]
})

验证用户

创建用户后,使用 db.auth 命令验证用户身份,传入用户名和密码进行认证。

db.auth("testuser", "password123")

启用身份验证

为确保只有经过身份验证的用户能访问 MongoDB,需启用身份验证。

编辑 MongoDB 配置文件 mongod.conf,添加内容:

security:authorization: "enabled"

重启 MongoDB 服务使更改生效;

或在启动命令中添加认证参数

mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

使用用户身份登录

启用身份验证后,用创建的用户身份连接到 MongoDB

mongosh --host <hostname> --port <port> -u "testuser" -p "password123" --authenticationDatabase "<database_name>"

删除用户

使用 db.dropUser 命令删除指定用户,

示例删除 testuser 用户。

db.dropUser("testuser")

实例操作

完整示例操作流程:

启动 mongosh 并连接到服务器。

mongosh --host localhost --port 27017

切换到 testdb 数据库。

use testdb

创建 testuser 用户,赋予 testdb 数据库的 readWrite 和 read 角色。

db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "testdb" },{ role: "read", db: "testdb" }]
})

重启 MongoDB 服务并开启认证

mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

使用Mongodb服务器开启认证

# 以 testuser 用户身份连接到 MongoDB,指定认证数据库为 testdb
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "testdb"# 切换到 testdb 数据库
test> use testdb;
switched to db testdb# 查看 testdb 数据库中的集合
testdb> show collections

去除认证后重启mongodb,登录删除testuser用户

# (需先去除认证并重启 mongod 后执行)删除 testuser 用户
db.dropUser("testuser")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911949.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以太网基础与 VLAN 配置实验

以太网是一种基于CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的共享通讯介质的数据网络通讯技术。当主机数目较多时会导致冲突严重、广播泛滥、性能显著下降甚至造成网络不可用等问题。通过交换机实现 LAN 互连虽然可以解决冲突严重的问题&#xff0c;但仍然不…

开源流程引擎Camunda简介

目录 简单介绍 主要组件与名词介绍 常见名词解释 核心组件介绍 一些思考 与前端的关系 前端逻辑的简化 后端接口的专注 流程引擎的控制作用 数据和状态的管理 监控和管理的集中化 参考资料 简单介绍 Camunda的本质是可以独立运行的一套流程引擎&#xff0c;流程引擎…

从面试题出发,如何设计消息队列

一、引言 在 Java 开发面试的战场上&#xff0c;消息队列相关问题一直是高频考点。面试官们常常抛出这样的问题&#xff1a;“如果让你设计一个消息队列&#xff0c;你会怎么做&#xff1f;” 这可不是在故意刁难&#xff0c;背后有着深层次的考察意图。​ 从实际场景来看&am…

卡萨帝发布AI深度科技:实现从守护生活到守护文明的升级

2025年6月25日&#xff0c;以“AI致远 爱不凡”为主题的卡萨帝思享荟于重庆科学会堂启幕。活动现场&#xff0c;卡萨帝发布“AI深度科技”。同时&#xff0c;搭载AI深度科技的“AI鉴赏家套系”同步上市。 AI浪潮下&#xff0c;卡萨帝品牌不断升级&#xff0c;从“高端家电领导…

FastAPI + PyMySQL 报错:“dict can not be used as parameter”的原因及解决方案

❌ FastAPI PyMySQL 报错 “dict can not be used as parameter” 问题及解决方案 最近在开发一个基于 FastAPI 的碳足迹因子智能匹配系统时&#xff0c;后端保存接口数据到 MySQL 时遇到了如下错误&#xff1a; ❌ 解析失败: dict can not be used as parameter 一、问题背景…

解决 “docker-compose: command not found“ 错误

解决 “docker-compose: command not found” 错误 在 CentOS 7 上看到这个错误&#xff0c;说明系统中未安装 docker-compose。以下是完整的安装和配置步骤&#xff1a; 一、安装 Docker Compose 1. 确保已安装 Docker # 检查 Docker 是否安装 docker --version# 如果未安…

Android11 深休后系统定时唤醒导致网络请求服务器过载

硬件平台&#xff1a;QCS6125 软件平台&#xff1a;Android11 问题&#xff1a;每天的7:00和22:00 服务器会突然收到批量设备的网络请求&#xff0c;导致服务器过载。 通过系统的logcat日志发现了系统在休眠后&#xff0c;每天会有22:00、7:00的唤醒&#xff0c;从而导致这个时…

部署网站需求全满足:Websoft9 多应用托管一站式方案解析

在数字化浪潮中&#xff0c;搭建专业网站已成为企业触达客户的核心通道。然而&#xff0c;从服务器选型到软件环境配置&#xff0c;传统建站模式往往让技术门槛成为中小企业的 “拦路虎”。Websoft9 多应用托管平台通过深度优化的镜像技术&#xff0c;重新定义了 WordPress 建站…

Spring Boot 启动优化实践

本文系统性分析并优化了一个Spring Boot项目启动耗时高达 280 秒的问题。通过识别瓶颈、优化分库分表加载逻辑、异步初始化耗时任务等手段&#xff0c;最终将启动耗时缩短至 159 秒&#xff0c;提升近 50%。文章涵盖启动流程分析、性能热点识别、异步初始化设计等关键技术细节&…

Jenkins执行Jenkinsfile报错

遇到部署的步骤时传输文件到其他服务器&#xff0c;文件传上去了&#xff0c;但是命令都没有执行成功。 写法&#xff1a; 报错了&#xff1a;ERROR:Exception when publishing,exception message [Exec exit status not zero.Status [1]] 原因是因为&#xff1a;cd 引用了环…

Modbus TCP转Profibus DP网接APM810/MCE安科瑞多功能电表通讯案例

Modbus TCP转Profibus DP网接APM810/MCE安科瑞多功能电表通讯案例 在工业自动化和电力监控领域&#xff0c;Modbus TCP与Profibus DP是两种常见的通讯协议&#xff0c;它们各自有着广泛的应用场景和优势。而当需要将这两者进行连接&#xff0c;以实现不同设备间的数据传输和信…

MySQL常见问题概述

一、MySQL常见问题概述 MySQL是最常用的关系型数据库&#xff0c;但使用中常会遇到 性能慢、数据丢失、主从不同步、锁冲突 等问题。这些问题可能导致系统响应变慢、用户操作失败&#xff0c;甚至数据损坏。 核心解决思路&#xff1a;先定位问题类型&#xff08;是查询慢&…

zlmediakit windows 编译webrtc

1、环境准备 系统环境&#xff1a;Windows 10 专业版 序号名称版本用途1Microsoft Visual Studio20222openssl3.0.53cmake3.24.04libsrtp2.4.0webrtc播放需要 2、安装libsrtp https://github.com/cisco/libsrtp/releases/tag/v2.4.2 2.1、新建构建目录 在libsrtp-2.4.2根目录…

Redis Pipelining 是性能加速的秘密武器?

在高性能的现代应用中&#xff0c;Redis 因其闪电般的速度而备受青睐。而 Pipelining&#xff08;管道技术&#xff09; 则是 Redis 性能优化的核心功能之一。许多开发者都听说过它能提升性能&#xff0c;但它究竟是如何做到的&#xff1f;是否会带来负面影响&#xff1f;今天我…

系统性能优化-6 TCP 三次握手

系统性能优化-6 TCP 三次握手 TCP 三次握手 客户端优化 客户端发送 SYN 给服务器 此时客户端连接状态&#xff1a;SYN_SENT如果服务器繁忙或中间网络不畅&#xff0c;客户端会重发 SYN&#xff0c;重试的次数由 tcp_syn_retries 参数控制&#xff0c;默认是 6 次&#xff0c;第…

WPF 实现自定义弹窗输入功能

1.前端实现 <Grid><Grid.RowDefinitions><RowDefinition Height"60" /><RowDefinition Height"*" /></Grid.RowDefinitions><BorderGrid.Row"0"BorderBrush"WhiteSmoke"BorderThickness"0.1&qu…

WPF中Converter基础用法

IValueConverter 1.创建一个类集成接口IValueConverter,并实现 2在xaml中引入 举例 性别用int来表示&#xff0c;1为男&#xff0c;2为女 核心代码 创建GenderConverter继承IValueConverter public class GenderConverter : IValueConverter {//model->view转换public…

Postgresql的json充当字典应用

一般我们会将一些系统参数放到参数表中&#xff0c;有些参数的值是json结构&#xff0c;那么如何在查询时引用这些参数&#xff1f;&#xff1f; 比如我在业务表的的xxx_type,或xxx_status记录的是key,又想在查询的时候显示其描述。 先定义字典 如下图如何应用 Postgresql对j…

Dify全面升级:打造极致智能应用开发体验,携手奇墨科技共拓AI新生态

智能应用开发平台Dify以六大核心功能升级与深度性能优化&#xff0c;重新定义AI开发效率与体验。本次更新不仅响应了开发者社区的迫切需求&#xff0c;更通过与云计算领域先锋奇墨科技的战略合作&#xff0c;为企业提供了从开发到部署的全链路智能化解决方案。 .技术领先&#…

关于uniapp开发阻止事件冒泡问题

背景。uniapp开发微信小程序。在使用两个组件拼接嵌套使用后&#xff0c;发现问题&#xff0c;会误操作跳转到更多页面。下图中两个事件若不使用stop修饰符&#xff0c;会相互影响。若点击uni-list-item会串行触发uni-card的handledoctorlist方法。 产生上面问题原因是组件之间…