文章目录
- 前言
- 一、数据库操作
-
- [1. 切换/创建数据库](#1. 切换/创建数据库)
- [2. 查看数据库](#2. 查看数据库)
-
- [2.1 查看所有数据库](#2.1 查看所有数据库)
- [2.2 查看当前数据库](#2.2 查看当前数据库)
- [3. 删除数据库](#3. 删除数据库)
- 二、集合操作
-
- [1. 创建集合](#1. 创建集合)
- [2. 查看集合](#2. 查看集合)
- [3. 删除集合](#3. 删除集合)
- 三、文档操作
-
- [1. 插入文档](#1. 插入文档)
-
- [1.1 单文档插入](#1.1 单文档插入)
- [1.2 多文档插入](#1.2 多文档插入)
- [2. 更新文档](#2. 更新文档)
-
- [2.1 单文档更新](#2.1 单文档更新)
- [2.2 多文档更新](#2.2 多文档更新)
- [3. 删除文档](#3. 删除文档)
-
- [3.1 单文档删除](#3.1 单文档删除)
- [3.2 多文档删除](#3.2 多文档删除)
- [四. 查询文档](#四. 查询文档)
-
- [1. 基本查询](#1. 基本查询)
- [2. 条件查询](#2. 条件查询)
- [3. 数组查询](#3. 数组查询)
- [4. 投影](#4. 投影)
- [5. 其他查询](#5. 其他查询)
-
- [5.1 查询第一个匹配的文档](#5.1 查询第一个匹配的文档)
- [5.2 限制返回文档的数量](#5.2 限制返回文档的数量)
- [5.3 跳过指定数量的文档](#5.3 跳过指定数量的文档)
- [5.4 排序查询](#5.4 排序查询)
- [5.5 嵌套文档查询](#5.5 嵌套文档查询)
- [5.6 正则表达式查询](#5.6 正则表达式查询)
- [6. 聚合操作](#6. 聚合操作)
-
- [6.1 聚合操作符](#6.1 聚合操作符)
- [6.2 聚合操作示例](#6.2 聚合操作示例)
- [6.3 Map-Reduce操作](#6.3 Map-Reduce操作)
-
- [6.3.1 MongoDB中Map-Reduce操作介绍](#6.3.1 MongoDB中Map-Reduce操作介绍)
- [6.3.2 Map-Reduce操作示例](#6.3.2 Map-Reduce操作示例)
- 五、索引操作
-
- [1. MongoDB索引介绍](#1. MongoDB索引介绍)
- [2. MongoDB索引类型](#2. MongoDB索引类型)
- [3. 创建索引](#3. 创建索引)
- [4. 查看索引](#4. 查看索引)
- [5. 删除索引](#5. 删除索引)
-
- [5.1 删除单个索引](#5.1 删除单个索引)
- [5.2 删除多个索引](#5.2 删除多个索引)
- 六、用户和权限管理
-
- [1. 内置角色及相关权限](#1. 内置角色及相关权限)
- [2. 创建用户](#2. 创建用户)
- [3. 查看用户](#3. 查看用户)
- [4. 修改用户](#4. 修改用户)
-
- [4.1 修改用户信息](#4.1 修改用户信息)
- [4.2 修改用户密码](#4.2 修改用户密码)
- [4.3 修改用户角色](#4.3 修改用户角色)
-
- [4.3.1 添加用户角色](#4.3.1 添加用户角色)
- [4.3.2 撤销用户角色](#4.3.2 撤销用户角色)
- [5. 删除用户](#5. 删除用户)
- 七、帮助信息命令
-
- [1. 查看命令帮助信息](#1. 查看命令帮助信息)
- [2. 查看数据库帮助信息](#2. 查看数据库帮助信息)
- [3. 查看集合帮助信息](#3. 查看集合帮助信息)
前言
本文是 MongoDB 的操作指南,全面介绍了其在数据库、集合、文档、索引、用户权限管理等方面的操作。开篇点明 MongoDB 在数据管理领域的重要性,随后详细阐述各项操作。数据库操作涵盖切换、创建、查看和删除数据库;集合操作包括创建、查看和删除集合;文档操作涉及插入、更新、删除和查询,查询又分为基本查询、条件查询、数组查询等多种方式,并介绍了聚合操作和 Map - Reduce 操作。索引操作讲解了索引类型、创建、查看和删除方法。用户权限管理介绍了内置角色和权限,以及用户的创建、查看、修改和删除操作。此外,还介绍了帮助信息命令。本文旨在帮助读者系统掌握 MongoDB 操作,为实际应用提供有力支持。
一、数据库操作
1. 切换/创建数据库
使用use
命令切换/创建数据库的语法如下:
cmd
use <database_name>
示例 :切换到名为 db_demo1
的数据库。如果该数据库不存在,MongoDB 不会在执行这条命令时创建它,但当你第一次存储数据(如插入文档)时,MongoDB 会自动创建这个数据库。
cmd
use db_demo1
2. 查看数据库
2.1 查看所有数据库
cmd
show dbs
执行结果如下图所示:

发现没有创建的数据库db_demo1
,是因为使用use命令创建的数据库中如果没有任何数据,没有数据的数据库可以理解为实际不存在。
2.2 查看当前数据库
cmd
db

3. 删除数据库
可以使用如下命令删除当前数据库。
cmd
db.dropDatabase()
删除当前数据库实际上只是把数据库中的数据清空,因为执行删除数据库命令后,再执行查看当前数据库的命令,依然显示当前数据库为删除之前的数据库。
cmd
db
db.dropDatabase()
db

二、集合操作
1. 创建集合
创建集合语法如下:
shell
db.createCollection(<collection_name>)
创建集合c_demo1
。
shell
db.createCollection('c_demo1')

2. 查看集合
查看当前数据库中的所有集合。
shell
show collections
执行结果如下图所示:

3. 删除集合
删除集合语法如下:
shell
db.<collection_name>.drop()
删除当前数据库中的集合c_demo1
。
shell
db.c_demo1.drop()
执行结果如下图所示:

三、文档操作
1. 插入文档
1.1 单文档插入
单文档插入语法如下:
shell
db.<collection_name>.insertOne(
<document>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
<document>
:要插入的文档,是一个 JSON 对象。writeConcern
:可选参数,指定写入操作的确认级别,用于控制写入操作在复制集成员中的传播和确认方式。ordered
:可选参数,在批量插入时才会用到,对于 insertOne 无实际意义。
示例 :切换到名为 db_demo2
的数据库。如果该数据库不存在,MongoDB 不会在执行这条命令时创建它,但当你第一次存储数据(如插入文档)时,MongoDB 会自动创建这个数据库。向集合c_demo2
中插入一个新文档。
shell
use db_demo2;
db.c_demo2.insertOne({
name: "John",
age: 30,
city: "New York"
});
执行结果如下图所示:

1.2 多文档插入
多文档插入语法如下:
shell
db.<collection_name>.insertMany(
[ <document 1>, <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
示例1 :向集合c_demo2
中插入两个新文档。
shell
db.c_demo2.insertMany([
{ name: "Alice", age: 25, city: "Los Angeles" },
{ name: "Bob", age: 35, city: "Chicago" }
]);
执行结果如下图所示:

示例2 :向集合c_demo3
中插入嵌套文档或数组。
shell
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 单文档更新
更新语法如下:
shell
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、 set、inc 等)来修改文档的字段。$set
:用于设置文档中指定字段的值。如果该字段不存在,则会创建该字段;如果字段已存在,则会更新其值。$inc
:用于对文档中指定的数字字段进行增量操作,即增加或减少该字段的值。该字段必须是数字类型,否则会报错。$unset
:用于从文档中删除指定的字段。$push
:用于向数组字段中添加一个元素。如果数组字段不存在,则会创建该数组字段并添加元素。$pull
:用于从数组字段中移除所有匹配指定值的元素。$addToSet
:用于向数组字段中添加一个元素,但只有当该元素不在数组中时才会添加,避免数组中出现重复元素。
upsert
:可选参数,布尔值。如果设置为 true,当没有匹配的文档时,会插入一个新文档;默认值为 false。writeConcern
:可选参数,指定写入操作的确认级别。collation
:可选参数,指定用于操作的排序规则。arrayFilters
:可选参数,用于过滤数组元素。hint
:可选参数,指定使用哪个索引进行查询
示例 :将c_demo2
文档中name
为Alice
的学生的age
更新为26
。
shell
db.c_demo2.updateOne(
{ "name": "Alice" },
{ $set: { "age": 26 } }
);
执行结果如下图所示:
2.2 多文档更新
多文档更新语法如下:
shell
db.<collection_name>.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
示例 :将所有 age
大于 20 的数据的name
设置为 new_name。
shell
db.c_demo2.updateMany(
{ "age": { $gt: 20 } },
{ $set: { "name": "new_name" } }
);
执行结果如下图所示:

3. 删除文档
3.1 单文档删除
删除集合中第一个匹配指定条件的文档。如果有多个文档满足条件,只会删除其中一个。
单文档删除语法如下:
shell
db.<collection_name>.deleteOne(
<filter>,
{
writeConcern: <document>
}
)
示例 :删除集合c_demo2
中name
为new_name
的第一个文档。
shell
db.c_demo2.deleteOne({ "name": "new_name" });
执行结果如下图所示:

3.2 多文档删除
删除集合中所有匹配指定条件的文档。
多文档删除语法如下:
shell
db.<collection_name>.deleteMany(
<filter>,
{
writeConcern: <document>
}
)
示例 :删除集合c_demo2
中age
大于 30 的所有文档。
shell
db.c_demo2.deleteMany({ "age": { $gt: 30 } });
执行结果如下图所示:

四. 查询文档
1. 基本查询
基本查询是最基础的查询方式,通过指定文档的字段和值来筛选文档。
查询语法如下:
shell
db.<collection_name>.find(<query>, <projection>)
或
shell
db.<collection_name>.find(<query>, <projection>).pretty()
<query>
:一个文档对象,用于指定查询条件。<projection>
:可选参数,用于指定返回文档中要包含或排除的字段。pretty()
:用于美化查询结果。
示例1 :查询集合c_demo2
中age
等于 30 的所有文档。
shell
db.c_demo2.find({ "age": 30 });
执行结果如下图所示:

示例2 :查询集合c_demo2
中的所有文档。
shell
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 的所有文档。
shell
db.c_demo2.find({ "age": { $gte: 25 } });
执行结果如下图所示:

示例2 :查询集合c_demo2
中age
大于 22 且小于 30 的所有文档。
shell
db.c_demo2.find({$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]});
执行结果如下图所示:

3. 数组查询
当文档中包含数组字段时,可以使用特定的操作符进行数组查询,如 $elemMatch
和 $size
。
示例1 :查询集合c_demo3
中 scores
数组中至少有一个元素大于 85 的文档。
shell
db.c_demo3.find({ "scores": { $elemMatch: { $gt: 85 } } });
执行结果如下图所示:

示例2 :查询集合c_demo3
中 scores
数组长度为 3 的文档。
shell
db.c_demo3.find({ "scores": { $size: 3 } });
执行结果如下图所示:

4. 投影
投影用于指定返回文档中要包含或排除的字段,默认情况下,_id
字段会被返回。
示例1 :包含指定字段 :查询集合c_demo2
中 name
和 city
字段,排除 _id
字段。
shell
db.c_demo2.find({}, { "name": 1, "city": 1, "_id": 0 });
执行结果如下图所示:

示例2 :排除指定字段 :排除 _id
和 name
字段。
shell
db.c_demo2.find({}, { "_id": 0, "name": 0 });
执行结果如下图所示:

5. 其他查询
5.1 查询第一个匹配的文档
findOne()
:返回第一个匹配的文档,而不是所有匹配的文档。
shell
db.c_demo2.findOne({ "name": "new_name" });
执行结果如下图所示:

5.2 限制返回文档的数量
查询集合c_demo2
的前两个文档。
shell
db.c_demo2.find().limit(2);
执行结果如下图所示:

5.3 跳过指定数量的文档
查询集合c_demo2
中跳过前3个文档的所有文档。
shell
db.c_demo2.find().skip(3);
执行结果如下图所示:

5.4 排序查询
sort()
:对查询结果进行排序,1 表示升序,-1 表示降序。
查询集合c_demo2
中的所有文档,并按age
进行升序排序。
shell
db.c_demo2.find({}, { "_id": 0 }).sort({ "age": 1 });
执行结果如下图所示:

5.5 嵌套文档查询
示例1 :查询集合c_demo3
中name
为zhangsan
,且嵌套文档info
中age
为 30 和address
为yunnan
的第一个匹配的文档。
shell
db.c_demo3.findOne({ "name": "zhangsan", "info.age": 30, "info.address": "yunnan" });
执行结果如下图所示:

5.6 正则表达式查询
示例1 :查询集合c_demo2
中city
的值以Los
开头的所有文档。
shell
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
插入多个文档,用于演示聚合操作。
shell
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 用于指定分组字段。
javascript
db.c_demo4.aggregate([
{
$group: {
_id: "$category",
totalValue: { $sum: "$value" }
}
}
])
执行结果如下图所示:

示例 2 : 使用 $match
过滤特定类别的文档。
javascript
db.c_demo4.aggregate([
{
$match: { category: "A" }
}
])
执行结果如下图所示:

示例 3 : 使用 $sort
对文档排序。
javascript
db.c_demo4.aggregate([
{
$sort: { value: -1 }
}
])
执行结果如下图所示:

示例 4 : 使用 $project
修改文档结构。
javascript
db.c_demo4.aggregate([
{
$project: {
_id: 0,
category: 1,
value: 1
}
}
])
执行结果如下图所示:

示例 5 : 使用 $skip
和 $limit
分页查询。
javascript
db.c_demo4.aggregate([
{ $skip: 2 },
{ $limit: 2 }
])
执行结果如下图所示:

示例 6 : 使用 $avg
计算平均值,_id 为 null 表示不分组,即把整个集合视为一个单一的组。
javascript
db.c_demo4.aggregate([
{
$group: {
_id: null,
averageValue: { $avg: "$value" }
}
}
])
执行结果如下图所示:

示例 7 : 使用 $min
和 $max
找出最小值和最大值。
javascript
db.c_demo4.aggregate([
{
$group: {
_id: null,
minValue: { $min: "$value" },
maxValue: { $max: "$value" }
}
}
])
执行结果如下图所示:

示例 8 : 使用 $push
收集数组中的元素。
javascript
db.c_demo4.aggregate([
{
$group: {
_id: "$category",
values: { $push: "$value" }
}
}
])
执行结果如下图所示:

示例 9 : 使用 $first
和 $last
返回数组中的第一个和最后一个元素。
javascript
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操作语法结构如下:
javascript
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操作。
javascript
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
中。
javascript
db.orders.mapReduce(
function() { emit(this.customer, this.amount); },
function(key, values) { return Array.sum(values); },
{
out: "order_totals"
}
);
执行结果如下图所示:

查看结果 :执行完上述操作后,可以通过查询新集合order_totals
来查看每个客户的订单总额。
javascript
db.order_totals.find();
执行结果如下图所示:

五、索引操作
1. MongoDB索引介绍
MongoDB中的索引是为了提高查询性能而设计的数据结构。通过为集合中的一个或多个字段创建索引,可以显著加快查询速度。然而,值得注意的是,虽然索引加速了读取操作,但它们也增加了写入操作(如插入和更新)的成本,并占用额外的存储空间。
2. MongoDB索引类型
MongoDB支持多种类型的索引,以满足不同的需求:
- 单字段索引:在单个字段上创建的索引。
- 复合索引:包含多个字段的索引。
- 多键索引:用于数组字段上的索引。
- 文本索引:支持对字符串内容进行全文搜索。
- 地理空间索引 :包括
2dsphere
和2d
索引,支持基于地理位置的数据查询。 - 哈希索引:主要用于支持分片键的哈希分片。
3. 创建索引
创建索引语法如下:
javascript
db.<collection_name>.createIndex( keys, options );
keys
:指定要索引的一个或多个字段以及每个字段的索引类型(1表示升序,-1表示降序)。对于复合索引,你可以传递一个包含多个键值对的对象。options
:(可选)一个文档,用于指定索引的行为和属性,如唯一性、背景构建等。
创建示例数据 :下面以一个名为students
的集合为例,演示如何创建索引。首先,创建一些示例数据:
javascript
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
字段创建一个升序索引。
javascript
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
字段上创建一个复合索引。
javascript
db.students.createIndex({ age: 1, scores: -1 });
执行结果如下图所示:

4. 查看索引
查看索引语法如下:
javascript
db.<collection_name>.getIndexes();
示例 :查看students
集合中已经存在的索引。
javascript
db.students.getIndexes();
执行结果如下图所示:

5. 删除索引
5.1 删除单个索引
删除单个索引语法如下:
javascript
db.<collection_name>.dropIndex(
<index>,
{
writeConcern: <document>
}
);
<index>
:可以是索引的名称(字符串类型),也可以是索引的键模式(文档类型)。索引名通常是 MongoDB 自动生成的,例如 { field1: 1, field2: -1 } 索引的默认名称可能是 field1_1_field2_-1。writeConcern
:可选参数,指定写入操作的确认级别,用于控制写入操作在复制集成员中的传播和确认方式。
示例1 :删除名为name_1
的索引。
javascript
db.students.dropIndex("name_1");
执行结果如下图所示:

- "nIndexesWas": 3:这表示在执行删除操作之前,集合中总共有3个索引。
- "ok": 1:这是一个状态标识符,表明操作成功完成。
示例2 :删除为age
和scores
字段创建的复合索引。
javascript
db.students.dropIndex({ age: 1, scores: -1 });
执行结果如下图所示:

5.2 删除多个索引
删除多个索引语法如下:
javascript
db.<collection_name>.dropIndexes(
<indexes>,
{
writeConcern: <document>
}
);
示例1 :删除除 _id
索引之外的所有索引。
javascript
db.students.dropIndexes();
或
javascript
db.students.dropIndexes("*");
示例2 :
分别为name
和age
字段创建升序索引。
javascript
db.students.createIndex({ name: 1 });
db.students.createIndex({ age: 1 });
根据索引名称删除name
和age
字段的升序索引。
javascript
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. 创建用户
创建用户语法如下:
shell
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
。
shell
use db_school;
db.createUser(
{
user: "user_school",
pwd: "123456",
roles: [ { role: "readWrite", db: "db_school" } ]
}
);
执行结果如下图所示:

示例2 :创建具有多个角色和跨数据库权限的用户。
创建一个名为 user_admin
的用户,该用户在 db_school
数据库具有 readWrite
角色,在 admin
数据库具有 userAdminAnyDatabase
角色。
shell
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
数据库只有只读权限。
shell
use testdb;
db.createUser(
{
user: "customuser",
pwd: "123456",
customData: { contact: "customuser@example.com" },
roles: [ { role: "read", db: "testdb" } ]
}
);
执行结果如下图所示:

3. 查看用户
查看单个用户信息语法如下:
shell
db.getUser(
<username>,
{
showCredentials: <boolean>,
showPrivileges: <boolean>,
showAuthenticationRestrictions: <boolean>
}
)
<username>
:要查看信息的用户的名称,是一个字符串类型。showCredentials
:可选参数,布尔值。如果设置为 true,则会显示用户的认证凭证信息;默认值为 false。showPrivileges
:可选参数,布尔值。如果设置为 true,则会显示用户的权限信息;默认值为 false。showAuthenticationRestrictions
:可选参数,布尔值。如果设置为 true,则会显示用户的认证限制信息;默认值为 false。
查看所有用户信息语法如下:
shell
db.getUsers(
{
showCredentials: <boolean>,
showPrivileges: <boolean>,
showAuthenticationRestrictions: <boolean>
}
)
示例1 :查看 db_school
数据库中名为 user_school
的用户信息。
shell
use db_school;
db.getUser("user_school");
执行结果如下图所示:

示例2 :查看 db_school
数据库中用户名为 user_school
的认证凭证信息和权限信息。
shell
use db_school;
db.getUser("user_school", { showCredentials: true, showPrivileges: true });
示例3 :查看 admin
数据库中的所有用户信息。
shell
use admin;
db.getUsers();
或
shell
use admin;
show users;
执行结果如下图所示:

4. 修改用户
4.1 修改用户信息
修改用户信息语法如下:
shell
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" }。
shell
use testdb;
db.updateUser(
"customuser",
{
customData: { contact: "newcontact@example.com" }
}
);
4.2 修改用户密码
修改用户密码语法如下:
shell
db.changeUserPassword("<username>", "<new_password>")
username
:要修改密码的用户的名称。new_password
:用户的新密码。
示例 :将 testdb
数据库中用户 customuser
的密码修改为 newSecurePass
。
shell
use testdb;
db.changeUserPassword("customuser", "newSecurePass");
4.3 修改用户角色
4.3.1 添加用户角色
添加角色语法如下:
shell
db.grantRolesToUser(
"<username>",
[
{ role: "<role>", db: "<database>" },
...
],
{
writeConcern: { <write_concern_options> } // 可选,写入关注选项
}
)
示例 :为 testdb
数据库中的用户 customuser
添加 readWrite
角色。
shell
use testdb;
db.grantRolesToUser(
"customuser",
[ { role: "readWrite", db: "testdb" } ]
);
4.3.2 撤销用户角色
撤销角色语法如下:
shell
db.revokeRolesFromUser(
"<username>",
[
{ role: "<role>", db: "<database>" },
...
],
{
writeConcern: { <write_concern_options> } // 可选,写入关注选项
}
)
示例 :撤销 testdb
数据库中用户 customuser
的 readWrite
角色。
shell
use testdb;
db.revokeRolesFromUser(
"customuser",
[ { role: "readWrite", db: "testdb" } ]
);
5. 删除用户
删除用户语法如下:
shell
db.dropUser(
<username>,
{
writeConcern: <document>
}
)
示例 :删除数据库 testdb
中的 customuser
用户。
shell
use testdb;
db.dropUser("customuser")
执行结果如下图所示:

七、帮助信息命令
1. 查看命令帮助信息
help
命令可以查看一些基本的命令列表。这包括集合操作、数据库操作等。
shell
help
2. 查看数据库帮助信息
db.help()
命令会显示与数据库相关的命令列表。
shell
db.help()
3. 查看集合帮助信息
db.collection.help()
命令会显示与集合相关的命令列表。
shell
db.collection.help()