MongoDB二-MongoDB命令详解
MongoDB(二) - MongoDB命令详解
前言
本文是 MongoDB 的操作指南,全面介绍了其在数据库、集合、文档、索引、用户权限管理等方面的操作。开篇点明 MongoDB 在数据管理领域的重要性,随后详细阐述各项操作。数据库操作涵盖切换、创建、查看和删除数据库;集合操作包括创建、查看和删除集合;文档操作涉及插入、更新、删除和查询,查询又分为基本查询、条件查询、数组查询等多种方式,并介绍了聚合操作和 Map - Reduce 操作。索引操作讲解了索引类型、创建、查看和删除方法。用户权限管理介绍了内置角色和权限,以及用户的创建、查看、修改和删除操作。此外,还介绍了帮助信息命令。本文旨在帮助读者系统掌握 MongoDB 操作,为实际应用提供有力支持。
一、数据库操作
1. 切换/创建数据库
使用
use
命令切换/创建数据库的语法如下:
use <database_name>
示例
:切换到名为
db_demo1
的数据库。如果该数据库不存在,MongoDB 不会在执行这条命令时创建它,但当你第一次存储数据(如插入文档)时,MongoDB 会自动创建这个数据库。
use db_demo1
2. 查看数据库
2.1 查看所有数据库
show dbs
执行结果如下图所示:
发现没有创建的数据库
db_demo1
,是因为使用use命令创建的数据库中如果没有任何数据,
没有数据的数据库可以理解为实际不存在
。
2.2 查看当前数据库
db
3. 删除数据库
可以使用如下命令删除当前数据库。
db.dropDatabase()
删除当前数据库实际上只是把数据库中的数据清空,因为执行删除数据库命令后,再执行查看当前数据库的命令,依然显示当前数据库为删除之前的数据库。
db
db.dropDatabase()
db
二、集合操作
1. 创建集合
创建集合语法如下:
db.createCollection(<collection_name>)
创建集合
c_demo1
。
db.createCollection('c_demo1')
2. 查看集合
查看当前数据库中的所有集合。
show collections
执行结果如下图所示:
3. 删除集合
删除集合语法如下:
db.<collection_name>.drop()
删除当前数据库中的集合
c_demo1
。
db.c_demo1.drop()
执行结果如下图所示:
三、文档操作
1. 插入文档
1.1 单文档插入
单文档插入语法如下:
db.<collection_name>.insertOne(
<document>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
<document>
:要插入的文档,是一个 JSON 对象。writeConcern
:可选参数,指定写入操作的确认级别,用于控制写入操作在复制集成员中的传播和确认方式。ordered
:可选参数,在批量插入时才会用到,对于 insertOne 无实际意义。
示例
:切换到名为
db_demo2
的数据库。如果该数据库不存在,MongoDB 不会在执行这条命令时创建它,但当你第一次存储数据(如插入文档)时,MongoDB 会自动创建这个数据库。向集合
c_demo2
中插入一个新文档。
use db_demo2;
db.c_demo2.insertOne({
name: "John",
age: 30,
city: "New York"
});
执行结果如下图所示:
1.2 多文档插入
多文档插入语法如下:
db.<collection_name>.insertMany(
[ <document 1>, <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
示例1
:向集合
c_demo2
中插入两个新文档。
db.c_demo2.insertMany([
{ name: "Alice", age: 25, city: "Los Angeles" },
{ name: "Bob", age: 35, city: "Chicago" }
]);
执行结果如下图所示:
示例2
:向集合
c_demo3
中插入嵌套文档或数组。
db.c_demo3.insertMany([
{ name: "zhangsan", info: { age: 30, address: "yunnan", hight: 176 } },
{ name: "lisi", info: { age: 31, address: "guizhou", hight: 175 } },
{ name: "wangwu", scores: [80, 90, 75] }
]);
执行结果如下图所示:
2. 更新文档
2.1 单文档更新
更新语法如下:
db.<collection_name>.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
<filter>
:用于筛选出需要更新的文档,类似于 SQL 中的 WHERE 子句。<update>
:指定更新操作,可使用更新操作符(如s e t 、 set、
se
t
、 inc 等)来修改文档的字段。
$set
:用于设置文档中指定字段的值。如果该字段不存在,则会创建该字段;如果字段已存在,则会更新其值。$inc
:用于对文档中指定的数字字段进行增量操作,即增加或减少该字段的值。该字段必须是数字类型,否则会报错。$unset
:用于从文档中删除指定的字段。$push
:用于向数组字段中添加一个元素。如果数组字段不存在,则会创建该数组字段并添加元素。$pull
:用于从数组字段中移除所有匹配指定值的元素。$addToSet
:用于向数组字段中添加一个元素,但只有当该元素不在数组中时才会添加,避免数组中出现重复元素。
upsert
:可选参数,布尔值。如果设置为 true,当没有匹配的文档时,会插入一个新文档;默认值为 false。writeConcern
:可选参数,指定写入操作的确认级别。collation
:可选参数,指定用于操作的排序规则。arrayFilters
:可选参数,用于过滤数组元素。hint
:可选参数,指定使用哪个索引进行查询
示例
:将
c_demo2
文档中
name
为
Alice
的学生的
age
更新为
26
。
db.c_demo2.updateOne(
{ "name": "Alice" },
{ $set: { "age": 26 } }
);
执行结果如下图所示:
2.2 多文档更新
多文档更新语法如下:
db.<collection_name>.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
示例
:将所有
age
大于 20 的数据的
name
设置为 new_name。
db.c_demo2.updateMany(
{ "age": { $gt: 20 } },
{ $set: { "name": "new_name" } }
);
执行结果如下图所示:
3. 删除文档
3.1 单文档删除
删除集合中第一个匹配指定条件的文档。如果有多个文档满足条件,只会删除其中一个。
单文档删除语法如下:
db.<collection_name>.deleteOne(
<filter>,
{
writeConcern: <document>
}
)
示例
:删除集合
c_demo2
中
name
为
new_name
的第一个文档。
db.c_demo2.deleteOne({ "name": "new_name" });
执行结果如下图所示:
3.2 多文档删除
删除集合中所有匹配指定条件的文档。
多文档删除语法如下:
db.<collection_name>.deleteMany(
<filter>,
{
writeConcern: <document>
}
)
示例
:删除集合
c_demo2
中
age
大于 30 的所有文档。
db.c_demo2.deleteMany({ "age": { $gt: 30 } });
执行结果如下图所示:
四. 查询文档
1. 基本查询
基本查询是最基础的查询方式,通过指定文档的字段和值来筛选文档。
查询语法如下:
db.<collection_name>.find(<query>, <projection>)
或
db.<collection_name>.find(<query>, <projection>).pretty()
<query>
:一个文档对象,用于指定查询条件。<projection>
:可选参数,用于指定返回文档中要包含或排除的字段。pretty()
:用于美化查询结果。
示例1
:查询集合
c_demo2
中
age
等于 30 的所有文档。
db.c_demo2.find({ "age": 30 });
执行结果如下图所示:
示例2
:查询集合
c_demo2
中的所有文档。
db.c_demo2.find({});
执行结果如下图所示:
2. 条件查询
MongoDB 条件查询操作符的介绍如下:
操作符 | 描述 | 示例 |
---|---|---|
$eq | 匹配 等于 指定值的文档。 | {age: {$eq: 28}} 将匹配 age 字段值为 28 的所有文档。 |
$ne | 匹配 不等于 指定值的文档。 | {age: {$ne: 28}} 将匹配 age 字段值不是 28 的所有文档。 |
$gt | 匹配 大于 指定值的文档。 | {age: {$gt: 28}} 将匹配 age 字段值大于 28 的所有文档。 |
$gte | 匹配 大于或等于 指定值的文档。 | {age: {$gte: 28}} 将匹配 age 字段值大于或等于 28 的所有文档。 |
$lt | 匹配 小于 指定值的文档。 | {age: {$lt: 28}} 将匹配 age 字段值小于 28 的所有文档。 |
$lte | 匹配 小于或等于 指定值的文档。 | {age: {$lte: 28}} 将匹配 age 字段值小于或等于 28 的所有文档。 |
$in | 匹配字段值在指定数组内的文档。 | {age: {$in: [20, 25, 30]}} 将匹配 age 字段值为 20、25 或 30 的所有文档。 |
$nin | 匹配字段值不在指定数组内的文档。 | {age: {$nin: [20, 25, 30]}} 将匹配 age 字段值不是 20、25 或 30 的所有文档。 |
$and | 匹配满足所有条件的文档。 | {$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]} 将匹配 age 字段值大于 20 并且小于 30 的所有文档。 |
$or | 匹配满足任一条件的文档。 | {$or: [{age: 20}, {age: 30}]} 将匹配 age 字段值为 20 或者 30 的所有文档。 |
$not | 匹配不符合条件的文档。这是一个用于逻辑否定的操作符。 | {age: {$not: {$gt: 25}}} 将匹配 age 字段值不大于 25 的所有文档。 |
$nor | 匹配不满足任何给定条件的文档。 | {$nor: [{age: 20}, {age: 30}]} 将匹配 age 字段值既不是 20 也不是 30 的所有文档。 |
示例1
:查询集合
c_demo2
中
age
大于等于 25 的所有文档。
db.c_demo2.find({ "age": { $gte: 25 } });
执行结果如下图所示:
示例2
:查询集合
c_demo2
中
age
大于 22 且小于 30 的所有文档。
db.c_demo2.find({$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]});
执行结果如下图所示:
3. 数组查询
当文档中包含数组字段时,可以使用特定的操作符进行数组查询,如
$elemMatch
和
$size
。
示例1
:查询集合
c_demo3
中
scores
数组中至少有一个元素大于 85 的文档。
db.c_demo3.find({ "scores": { $elemMatch: { $gt: 85 } } });
执行结果如下图所示:
示例2
:查询集合
c_demo3
中
scores
数组长度为 3 的文档。
db.c_demo3.find({ "scores": { $size: 3 } });
执行结果如下图所示:
4. 投影
投影用于指定返回文档中要包含或排除的字段,默认情况下,
_id
字段会被返回。
示例1
:
包含指定字段
:查询集合
c_demo2
中
name
和
city
字段,排除
_id
字段。
db.c_demo2.find({}, { "name": 1, "city": 1, "_id": 0 });
执行结果如下图所示:
示例2
:
排除指定字段
:排除
_id
和
name
字段。
db.c_demo2.find({}, { "_id": 0, "name": 0 });
执行结果如下图所示:
5. 其他查询
5.1 查询第一个匹配的文档
findOne()
:返回第一个匹配的文档,而不是所有匹配的文档。
db.c_demo2.findOne({ "name": "new_name" });
执行结果如下图所示:
5.2 限制返回文档的数量
查询集合
c_demo2
的前两个文档。
db.c_demo2.find().limit(2);
执行结果如下图所示:
5.3 跳过指定数量的文档
查询集合
c_demo2
中跳过前3个文档的所有文档。
db.c_demo2.find().skip(3);
执行结果如下图所示:
5.4 排序查询
sort()
:对查询结果进行排序,1 表示升序,-1 表示降序。
查询集合
c_demo2
中的所有文档,并按
age
进行升序排序。
db.c_demo2.find({}, { "_id": 0 }).sort({ "age": 1 });
执行结果如下图所示:
5.5 嵌套文档查询
示例1
:查询集合
c_demo3
中
name
为
zhangsan
,且嵌套文档
info
中
age
为 30 和
address
为
yunnan
的第一个匹配的文档。
db.c_demo3.findOne({ "name": "zhangsan", "info.age": 30, "info.address": "yunnan" });
执行结果如下图所示:
5.6 正则表达式查询
示例1
:查询集合
c_demo2
中
city
的值以
Los
开头的所有文档。
db.c_demo2.find({ "city": /^Los/ });
执行结果如下图所示:
6. 聚合操作
6.1 聚合操作符
MongoDB 中常用的聚合操作符如下:
操作符 | 描述 |
---|---|
$group | 按指定字段分组,并可以执行聚合表达式来计算汇总值。 |
$limit | 限制传递给下一个阶段的文档数量。 |
$match | 过滤通过的文档,只传递符合指定条件的文档到下一个阶段。 |
$sort | 对输入文档按指定字段排序。 |
$project | 修改文档结构,包括重命名、增加或移除字段等。 |
$skip | 忽略指定数量的文档。 |
$sum | 计算数值字段的总和。 |
$avg | 计算数值字段的平均值。 |
$min | 找出数值字段的最小值。 |
$max | 找出数值字段的最大值。 |
$push | 将数组字段中的元素添加到输出文档中。 |
$first | 返回数组中的第一个元素。 |
$last | 返回数组中的最后一个元素。 |
6.2 聚合操作示例
在当前数据库中给集合
c_demo4
插入多个文档,用于演示聚合操作。
db.c_demo4.insertMany([
{ _id: 1, category: "A", value: 10 },
{ _id: 2, category: "B", value: 20 },
{ _id: 3, category: "A", value: 30 },
{ _id: 4, category: "B", value: 40 },
{ _id: 5, category: "C", value: 50 },
{ _id: 6, category: "A", value: 10 },
{ _id: 7, category: "B", value: 20 },
{ _id: 8, category: "A", value: 30 },
{ _id: 9, category: "B", value: 40 },
{ _id: 10, category: "C", value: 50 }
])
执行结果如下图所示:
- 示例 1
- 使用
$group
计算每个类别的总和, _id 用于指定分组字段 。
db.c_demo4.aggregate([
{
$group: {
_id: "$category",
totalValue: { $sum: "$value" }
}
}
])
执行结果如下图所示:
- 示例 2
- 使用
$match
过滤特定类别的文档。
db.c_demo4.aggregate([
{
$match: { category: "A" }
}
])
执行结果如下图所示:
- 示例 3
- 使用
$sort
对文档排序。
db.c_demo4.aggregate([
{
$sort: { value: -1 }
}
])
执行结果如下图所示:
- 示例 4
- 使用
$project
修改文档结构。
db.c_demo4.aggregate([
{
$project: {
_id: 0,
category: 1,
value: 1
}
}
])
执行结果如下图所示:
- 示例 5
- 使用
$skip
和$limit
分页查询。
db.c_demo4.aggregate([
{ $skip: 2 },
{ $limit: 2 }
])
执行结果如下图所示:
- 示例 6
- 使用
$avg
计算平均值,_id 为 null 表示不分组,即把整个集合视为一个单一的组。
db.c_demo4.aggregate([
{
$group: {
_id: null,
averageValue: { $avg: "$value" }
}
}
])
执行结果如下图所示:
- 示例 7
- 使用
$min
和$max
找出最小值和最大值。
db.c_demo4.aggregate([
{
$group: {
_id: null,
minValue: { $min: "$value" },
maxValue: { $max: "$value" }
}
}
])
执行结果如下图所示:
- 示例 8
- 使用
$push
收集数组中的元素。
db.c_demo4.aggregate([
{
$group: {
_id: "$category",
values: { $push: "$value" }
}
}
])
执行结果如下图所示:
- 示例 9
- 使用
$first
和$last
返回数组中的第一个和最后一个元素。
db.c_demo4.aggregate([
{
$group: {
_id: "$category",
firstValue: { $first: "$value" },
lastValue: { $last: "$value" }
}
}
])
执行结果如下图所示:
6.3 Map-Reduce操作
MongoDB使用Map-Reduce来处理复杂的数据分析任务。
6.3.1 MongoDB中Map-Reduce操作介绍
Map-Reduce在MongoDB中是一种用于处理和聚合数据的强大工具,尤其适用于需要对大量数据进行复杂分析的场景。下面是对MongoDB中Map-Reduce操作语法的介绍。
基本概念 :
- Map函数
:负责处理输入文档,并为每个输入文档调用一次
emit(key, value)
函数生成键值对。 - Reduce函数 :接收Map阶段输出的一个键和该键对应的值列表,并将这些值归约为一个单一的输出值。
- Finalize函数(可选) :在所有Map和Reduce操作完成后,可以使用此函数对结果进行最后的修改或格式化。
Map-Reduce操作语法结构如下 :
db.<collection_name>.mapReduce(
function() { /* map function */ },
function(key, values) { /* reduce function */ },
{
out: /* 输出选项 */,
query: /* 可选:过滤条件 */,
sort: /* 可选:排序 */,
limit: /* 可选:限制返回的文档数 */,
finalize: /* 可选:finalize函数 */,
scope: /* 可选:定义全局变量 */,
jsMode: /* 可选:优化内存使用 */,
verbose: /* 可选:是否输出详细信息 */
}
);
参数说明 :
- map
:必需,指定Map函数。这个函数会遍历每个文档,并调用
emit(key, value)
产生键值对。 - reduce :必需,指定Reduce函数。这个函数接收Map阶段产生的键和对应的值数组,并将其归约为单个值。
- out
:必需,指定Map-Reduce操作的结果如何输出。可以是:
{inline: 1}
:结果直接返回,适用于小数据集。"collectionName"
:结果存储在一个指定的集合中。{"replace": "collectionName"}
、{"merge": "collectionName"}
、{"reduce": "collectionName"}
:分别表示替换、合并、减少到指定集合。
- query :可选,用于筛选输入文档的条件。
- sort :可选,用于对输入文档进行排序。
- limit :可选,限制传递给Map函数的文档数量。
- finalize :可选,最终处理函数,在所有Map和Reduce操作完成后应用。
- scope :可选,可以在JavaScript函数中使用的全局变量。
- jsMode :可选,通过尽量减少BSON和JS之间的转换来提高性能。
- verbose :可选,设置为true时,提供详细的执行统计信息。
注意事项 :
- Map和Reduce函数必须是纯函数,即相同的输入总是产生相同的输出。
- Reduce函数的输出格式应该与Map函数的
emit
格式兼容,以便于可能的多次归约。 - 对于较大的数据集,考虑使用Aggregation Pipeline作为替代方案,因为它通常更高效且易于使用。
6.3.2 Map-Reduce操作示例
在当前数据库中给集合
orders
插入多个文档,用于演示Map-Reduce操作。
db.orders.insertMany([
{ "_id" : 1, "customer" : "Alice", "amount" : 50 },
{ "_id" : 2, "customer" : "Bob", "amount" : 100 },
{ "_id" : 3, "customer" : "Alice", "amount" : 75 },
{ "_id" : 4, "customer" : "Charlie", "amount" : 150 },
{ "_id" : 5, "customer" : "Bob", "amount" : 200 }
]);
执行结果如下图所示:
示例 :
定义Map函数 :这个函数会遍历每个文档,并为每个客户发出一个键值对,其中键是客户名,值是订单金额。
定义Reduce函数 :这个函数接收Map阶段输出的键和对应的值列表,并计算总和。
执行Map-Reduce
:使用上面定义的Map和Reduce函数执行Map-Reduce操作,并将结果存储在一个新的集合
order_totals
中。
db.orders.mapReduce(
function() { emit(this.customer, this.amount); },
function(key, values) { return Array.sum(values); },
{
out: "order_totals"
}
);
执行结果如下图所示:
查看结果
:执行完上述操作后,可以通过查询新集合
order_totals
来查看每个客户的订单总额。
db.order_totals.find();
执行结果如下图所示:
五、索引操作
1. MongoDB索引介绍
MongoDB中的索引是为了提高查询性能而设计的数据结构。通过为集合中的一个或多个字段创建索引,可以显著加快查询速度。然而,值得注意的是,虽然索引加速了读取操作,但它们也增加了写入操作(如插入和更新)的成本,并占用额外的存储空间。
2. MongoDB索引类型
MongoDB支持多种类型的索引,以满足不同的需求:
- 单字段索引 :在单个字段上创建的索引。
- 复合索引 :包含多个字段的索引。
- 多键索引 :用于数组字段上的索引。
- 文本索引 :支持对字符串内容进行全文搜索。
- 地理空间索引
:包括
2dsphere
和2d
索引,支持基于地理位置的数据查询。 - 哈希索引 :主要用于支持分片键的哈希分片。
3. 创建索引
创建索引语法如下:
db.<collection_name>.createIndex( keys, options );
keys
:指定要索引的一个或多个字段以及每个字段的索引类型(1表示升序,-1表示降序)。对于复合索引,你可以传递一个包含多个键值对的对象。options
:(可选)一个文档,用于指定索引的行为和属性,如唯一性、背景构建等。
创建示例数据
:下面以一个名为
students
的集合为例,演示如何创建索引。首先,创建一些示例数据:
use db_school;
db.students.insertMany([
{ name: "Alice", age: 20, scores: [85, 90], address: { city: "Beijing" } },
{ name: "Bob", age: 22, scores: [70, 75], address: { city: "Shanghai" } },
{ name: "Charlie", age: 21, scores: [90, 88], address: { city: "Guangzhou" } }
]);
执行结果如下图所示:
示例1
:为
name
字段创建一个升序索引。
db.students.createIndex({ name: 1 });
执行结果如下图所示:
- “numIndexesBefore”: 1
:这表示在创建新索引之前,集合中已经存在的索引数量。由于MongoDB默认会在
_id
字段上自动创建一个索引,所以这里显示的是1。 - “numIndexesAfter”: 2
:这表明在成功创建新索引之后,集合中现在总共有的索引数量。因为刚刚为
name
字段创建了一个新的升序索引,所以索引总数从1增加到了2。 - “createdCollectionAutomatically”: false
:这个字段指示是否因为创建索引而自动创建了集合。在这个例子中,值为
false
,意味着集合students
在执行此操作之前已经存在,并非因创建索引而自动创建的。 - “ok”: 1
:这是一个状态标识符,表明操作成功完成。如果出现错误,这个字段的值会是
0
,并且通常会有额外的错误信息来描述问题所在。
示例2
:在
age
和
scores
字段上创建一个复合索引。
db.students.createIndex({ age: 1, scores: -1 });
执行结果如下图所示:
4. 查看索引
查看索引语法如下:
db.<collection_name>.getIndexes();
示例
:查看
students
集合中已经存在的索引。
db.students.getIndexes();
执行结果如下图所示:
5. 删除索引
5.1 删除单个索引
删除单个索引语法如下:
db.<collection_name>.dropIndex(
<index>,
{
writeConcern: <document>
}
);
<index>
:可以是索引的名称(字符串类型),也可以是索引的键模式(文档类型)。索引名通常是 MongoDB 自动生成的,例如 { field1: 1, field2: -1 } 索引的默认名称可能是 field1_1_field2_-1。writeConcern
:可选参数,指定写入操作的确认级别,用于控制写入操作在复制集成员中的传播和确认方式。
示例1
:删除名为
name_1
的索引。
db.students.dropIndex("name_1");
执行结果如下图所示:
- “nIndexesWas”: 3 :这表示在执行删除操作之前,集合中总共有3个索引。
- “ok”: 1 :这是一个状态标识符,表明操作成功完成。
示例2
:删除为
age
和
scores
字段创建的复合索引。
db.students.dropIndex({ age: 1, scores: -1 });
执行结果如下图所示:
5.2 删除多个索引
删除多个索引语法如下:
db.<collection_name>.dropIndexes(
<indexes>,
{
writeConcern: <document>
}
);
示例1
:删除除
_id
索引之外的所有索引。
db.students.dropIndexes();
或
db.students.dropIndexes("*");
示例2 :
分别为
name
和
age
字段创建升序索引。
db.students.createIndex({ name: 1 });
db.students.createIndex({ age: 1 });
根据索引名称删除
name
和
age
字段的升序索引。
db.students.dropIndexes(["age_1", "name_1"]);
执行结果如下图所示:
六、用户和权限管理
1. 内置角色及相关权限
MongoDB内置了多种角色,用于提供不同层次和类型的权限管理。
以下概述了一些常用的内置角色及其描述:
角色名称 | 描述 |
---|---|
read | 允许用户读取指定数据库中的所有非系统集合的数据。 |
readWrite | 包括 read 角色的所有权限,并允许在所有非系统集合上进行插入、更新和删除操作。 |
dbAdmin | 提供执行管理任务的能力,如模式管理(索引创建和删除)、统计信息收集等,但不包括用户和角色管理。 |
userAdmin | 允许管理当前数据库的用户和角色,包括创建用户、修改密码以及分配角色。拥有此角色的用户可以赋予自己任何权限。 |
clusterAdmin | 提供最高的集群管理操作权限,包括添加和移除节点、查看集群状态等。它包含其他集群管理角色,如 clusterManager 、 clusterMonitor 和 hostManager 。 |
readAnyDatabase | 类似于 read 角色,但是作用范围扩展到了所有的数据库(除了 local 和 config )。需要在 admin 数据库中授予。 |
readWriteAnyDatabase | 类似于 readWrite 角色,但是作用范围扩展到了所有的数据库(除了 local 和 config )。需要在 admin 数据库中授予。 |
userAdminAnyDatabase | 类似于 userAdmin 角色,但是作用范围扩展到了所有的数据库。允许管理所有数据库中的用户和角色。需要在 admin 数据库中授予。 |
dbAdminAnyDatabase | 类似于 dbAdmin 角色,但是作用范围扩展到了所有的数据库。需要在 admin 数据库中授予。 |
root | 超级用户角色,拥有对整个系统的完全控制权,包括对所有资源的访问权限。仅适用于 admin 数据库。 |
2. 创建用户
创建用户语法如下:
db.createUser(
{
user: "<username>",
pwd: "<password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
mechanisms: [ "<SCRAM-SHA-1>" | "<SCRAM-SHA-256>", ... ],
passwordDigestor: "<server|client>"
}
)
user
:指定要创建的用户名,是一个字符串类型。pwd
:指定用户的密码,可以是字符串或 PasswordPrompt() 函数(用于交互式输入密码)。customData
:可选参数,用于存储与用户相关的自定义数据,是一个文档对象。roles
:指定用户被授予的角色,可以是一个角色数组。每个角色可以是一个文档对象 { role: “”, db: “” },表示在指定数据库上的角色;也可以是一个简单的角色名称字符串。mechanisms
:可选参数,指定认证机制,如 “SCRAM-SHA-1” 或 “SCRAM-SHA-256”。passwordDigestor
:可选参数,指定密码摘要器,值可以是 “server” 或 “client”。
示例1 :在单个数据库中创建用户。
在
db_school
数据库中创建一个具有
readWrite
角色的用户
user_school
。
use db_school;
db.createUser(
{
user: "user_school",
pwd: "123456",
roles: [ { role: "readWrite", db: "db_school" } ]
}
);
执行结果如下图所示:
示例2 :创建具有多个角色和跨数据库权限的用户。
创建一个名为
user_admin
的用户,该用户在
db_school
数据库具有
readWrite
角色,在
admin
数据库具有
userAdminAnyDatabase
角色。
use admin;
db.createUser(
{
user: "user_admin",
pwd: "123456",
roles: [
{ role: "readWrite", db: "db_school" },
{ role: "userAdminAnyDatabase", db: "admin" }
]
}
);
执行结果如下图所示:
示例3 :使用自定义数据创建用户。
为用户 customuser 添加了一个 contact 字段作为自定义数据,该用户对 testdb 数据库只有只读权限
创建一个名为
customuser
的用户,并为用户
customuser
添加一个
contact
字段作为自定义数据,该用户对
testdb
数据库只有只读权限。
use testdb;
db.createUser(
{
user: "customuser",
pwd: "123456",
customData: { contact: "customuser@example.com" },
roles: [ { role: "read", db: "testdb" } ]
}
);
执行结果如下图所示:
3. 查看用户
查看单个用户信息语法如下:
db.getUser(
<username>,
{
showCredentials: <boolean>,
showPrivileges: <boolean>,
showAuthenticationRestrictions: <boolean>
}
)
<username>
:要查看信息的用户的名称,是一个字符串类型。showCredentials
:可选参数,布尔值。如果设置为 true,则会显示用户的认证凭证信息;默认值为 false。showPrivileges
:可选参数,布尔值。如果设置为 true,则会显示用户的权限信息;默认值为 false。showAuthenticationRestrictions
:可选参数,布尔值。如果设置为 true,则会显示用户的认证限制信息;默认值为 false。
查看所有用户信息语法如下:
db.getUsers(
{
showCredentials: <boolean>,
showPrivileges: <boolean>,
showAuthenticationRestrictions: <boolean>
}
)
示例1
:查看
db_school
数据库中名为
user_school
的用户信息。
use db_school;
db.getUser("user_school");
执行结果如下图所示:
示例2
:查看
db_school
数据库中用户名为
user_school
的认证凭证信息和权限信息。
use db_school;
db.getUser("user_school", { showCredentials: true, showPrivileges: true });
示例3
:查看
admin
数据库中的所有用户信息。
use admin;
db.getUsers();
或
use admin;
show users;
执行结果如下图所示:
4. 修改用户
4.1 修改用户信息
修改用户信息语法如下:
db.updateUser(
"<username>",
{
customData: { <new_custom_data> },
roles: [ { role: "<role>", db: "<database>" }, ... ], // 可选,用于同时更新角色
pwd: "<new_password>" // 可选,用于同时更新密码
},
{
writeConcern: { <write_concern_options> } // 可选,写入关注选项
}
)
<username>
:要修改自定义数据的用户的名称,是一个字符串类型。customData: { <newCustomData> }
:新的自定义数据,是一个文档对象。roles
:可选参数,用于更新用户的角色列表。pwd
:可选参数,用于同时更新用户的密码。writeConcern
:可选参数,指定写入操作的确认级别。
示例
:将
testdb
数据库中
customuser
用户的自定义数据修改为 { contact: “newcontact@example.com” }。
use testdb;
db.updateUser(
"customuser",
{
customData: { contact: "newcontact@example.com" }
}
);
4.2 修改用户密码
修改用户密码语法如下:
db.changeUserPassword("<username>", "<new_password>")
username
:要修改密码的用户的名称。new_password
:用户的新密码。
示例
:将
testdb
数据库中用户
customuser
的密码修改为
newSecurePass
。
use testdb;
db.changeUserPassword("customuser", "newSecurePass");
4.3 修改用户角色
4.3.1 添加用户角色
添加角色语法如下:
db.grantRolesToUser(
"<username>",
[
{ role: "<role>", db: "<database>" },
...
],
{
writeConcern: { <write_concern_options> } // 可选,写入关注选项
}
)
示例
:为
testdb
数据库中的用户
customuser
添加
readWrite
角色。
use testdb;
db.grantRolesToUser(
"customuser",
[ { role: "readWrite", db: "testdb" } ]
);
4.3.2 撤销用户角色
撤销角色语法如下:
db.revokeRolesFromUser(
"<username>",
[
{ role: "<role>", db: "<database>" },
...
],
{
writeConcern: { <write_concern_options> } // 可选,写入关注选项
}
)
示例
:撤销
testdb
数据库中用户
customuser
的
readWrite
角色。
use testdb;
db.revokeRolesFromUser(
"customuser",
[ { role: "readWrite", db: "testdb" } ]
);
5. 删除用户
删除用户语法如下:
db.dropUser(
<username>,
{
writeConcern: <document>
}
)
示例
:删除数据库
testdb
中的
customuser
用户。
use testdb;
db.dropUser("customuser")
执行结果如下图所示:
七、帮助信息命令
1. 查看命令帮助信息
help
命令可以查看一些基本的命令列表。这包括集合操作、数据库操作等。
help
2. 查看数据库帮助信息
db.help()
命令会显示与数据库相关的命令列表。
db.help()
3. 查看集合帮助信息
db.collection.help()
命令会显示与集合相关的命令列表。
db.collection.help()