目录

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/f34ab8e67f474da7be4fc27b8e60e4e0.png

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

2.2 查看当前数据库

db

https://i-blog.csdnimg.cn/direct/07258309c8ce4027b2469aa5160f7f88.png

3. 删除数据库

可以使用如下命令删除当前数据库。

db.dropDatabase()

删除当前数据库实际上只是把数据库中的数据清空,因为执行删除数据库命令后,再执行查看当前数据库的命令,依然显示当前数据库为删除之前的数据库。

db
db.dropDatabase()
db

https://i-blog.csdnimg.cn/direct/6769bf6bff894accb4b301662775223b.png


二、集合操作

1. 创建集合

创建集合语法如下:

db.createCollection(<collection_name>)

创建集合 c_demo1

db.createCollection('c_demo1')

https://i-blog.csdnimg.cn/direct/8ebb396f67d940998d18af333c030f3f.png

2. 查看集合

查看当前数据库中的所有集合。

show collections

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/a8659381100d4560b82a4376eb7be9e7.png

3. 删除集合

删除集合语法如下:

db.<collection_name>.drop()

删除当前数据库中的集合 c_demo1

db.c_demo1.drop()

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/52020de4435a4eb78576426d3cce3c8f.png


三、文档操作

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/fbf8dc7a120e4e4890784285c0300ef8.png

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/3560b25f9d1c46eaa8b93e020cd7e085.png

示例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] }
]);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/beaee408ace04abeafc39ca0fd475fc0.png

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 文档中 nameAlice 的学生的 age 更新为 26

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/a187c538342e435aa1124aa87d6bf23c.png

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/0b1eedb062c6428cb3f69629d3b32e1c.png

3. 删除文档

3.1 单文档删除

删除集合中第一个匹配指定条件的文档。如果有多个文档满足条件,只会删除其中一个。

单文档删除语法如下:

db.<collection_name>.deleteOne(
   <filter>,
   {
     writeConcern: <document>
   }
)

示例 :删除集合 c_demo2namenew_name 的第一个文档。

db.c_demo2.deleteOne({ "name": "new_name" });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/c4fe4d1074df4d3f910db2b624061259.png

3.2 多文档删除

删除集合中所有匹配指定条件的文档。

多文档删除语法如下:

db.<collection_name>.deleteMany(
   <filter>,
   {
     writeConcern: <document>
   }
)

示例 :删除集合 c_demo2age 大于 30 的所有文档。

db.c_demo2.deleteMany({ "age": { $gt: 30 } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/c6e6ed47180d49dc83c19e16be407b73.png


四. 查询文档

1. 基本查询

基本查询是最基础的查询方式,通过指定文档的字段和值来筛选文档。

查询语法如下:

db.<collection_name>.find(<query>, <projection>)

db.<collection_name>.find(<query>, <projection>).pretty()
  • <query> :一个文档对象,用于指定查询条件。
  • <projection> :可选参数,用于指定返回文档中要包含或排除的字段。
  • pretty() :用于美化查询结果。

示例1 :查询集合 c_demo2age 等于 30 的所有文档。

db.c_demo2.find({ "age": 30 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/40ea6b65550e47e0a90824540ed4a786.png

示例2 :查询集合 c_demo2 中的所有文档。

db.c_demo2.find({});

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/10e9ec0cc1eb4787adda918e18cb41d2.png

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_demo2age 大于等于 25 的所有文档。

db.c_demo2.find({ "age": { $gte: 25 } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/978bc6b4a9ec4c2fa0dcfdee6fd8cbbc.png

示例2 :查询集合 c_demo2age 大于 22 且小于 30 的所有文档。

db.c_demo2.find({$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]});

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/40528f9b50e3423fa4f000c57e4c0bdd.png

3. 数组查询

当文档中包含数组字段时,可以使用特定的操作符进行数组查询,如 $elemMatch$size

示例1 :查询集合 c_demo3scores 数组中至少有一个元素大于 85 的文档。

db.c_demo3.find({ "scores": { $elemMatch: { $gt: 85 } } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/2cd3f999b3f24aa5a45af82466b1529c.png

示例2 :查询集合 c_demo3scores 数组长度为 3 的文档。

db.c_demo3.find({ "scores": { $size: 3 } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ae92ea817f59487095d0ed598ff69491.png

4. 投影

投影用于指定返回文档中要包含或排除的字段,默认情况下, _id 字段会被返回。

示例1包含指定字段 :查询集合 c_demo2namecity 字段,排除 _id 字段。

db.c_demo2.find({}, { "name": 1, "city": 1, "_id": 0 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ed1aee801d70480bb304fa7d6ac5d5a8.png

示例2排除指定字段 :排除 _idname 字段。

db.c_demo2.find({}, { "_id": 0, "name": 0 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/2e751afeee9141a3afb6f07cdebb9fd3.png

5. 其他查询

5.1 查询第一个匹配的文档

findOne() :返回第一个匹配的文档,而不是所有匹配的文档。

db.c_demo2.findOne({ "name": "new_name" });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/cb206c9e6f864363a7203022332a042d.png

5.2 限制返回文档的数量

查询集合 c_demo2 的前两个文档。

db.c_demo2.find().limit(2);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/0797b639d9274f358705ab6827de4e01.png

5.3 跳过指定数量的文档

查询集合 c_demo2 中跳过前3个文档的所有文档。

db.c_demo2.find().skip(3);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/0c6e3d8379ef4e11a4dde3b0323baf96.png

5.4 排序查询

sort() :对查询结果进行排序,1 表示升序,-1 表示降序。

查询集合 c_demo2 中的所有文档,并按 age 进行升序排序。

db.c_demo2.find({}, { "_id": 0 }).sort({ "age": 1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/26e4f148a76f421ba03047b18326a952.png

5.5 嵌套文档查询

示例1 :查询集合 c_demo3namezhangsan ,且嵌套文档 infoage 为 30 和 addressyunnan 的第一个匹配的文档。

db.c_demo3.findOne({ "name": "zhangsan", "info.age": 30, "info.address": "yunnan" });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7ee556d7f95a436aa47ff0ebeee7c1a3.png

5.6 正则表达式查询

示例1 :查询集合 c_demo2city 的值以 Los 开头的所有文档。

db.c_demo2.find({ "city": /^Los/ });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/1cd242e89a424e04a6960b8cd372cdf6.png

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7806134e2fd64d6daa39829e85b49f92.png

示例 1
使用 $group 计算每个类别的总和, _id 用于指定分组字段
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            totalValue: { $sum: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/be759b6340594b769e12f10ce44ded8c.png

示例 2
使用 $match 过滤特定类别的文档。
db.c_demo4.aggregate([
    {
        $match: { category: "A" }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/1c5b7e7879804b69bbc7099c62a395b8.png

示例 3
使用 $sort 对文档排序。
db.c_demo4.aggregate([
    {
        $sort: { value: -1 }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7947ff06370b4d5bb42554a735528a14.png

示例 4
使用 $project 修改文档结构。
db.c_demo4.aggregate([
    {
        $project: {
            _id: 0,
            category: 1,
            value: 1
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ba436f5c272445a8b87caa12ec51c613.png

示例 5
使用 $skip$limit 分页查询。
db.c_demo4.aggregate([
    { $skip: 2 },
    { $limit: 2 }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/41877a85a3b749908aa4fc47906fbe64.png

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/c8e4bc4a4e50485fb9aa17ad44f2494a.png

示例 7
使用 $min$max 找出最小值和最大值。
db.c_demo4.aggregate([
    {
        $group: {
            _id: null,
            minValue: { $min: "$value" },
            maxValue: { $max: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/d3a597f0d956496395963c955f07240f.png

示例 8
使用 $push 收集数组中的元素。
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            values: { $push: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/5572d2abfeae4ffc9fde7e645b02570c.png

示例 9
使用 $first$last 返回数组中的第一个和最后一个元素。
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            firstValue: { $first: "$value" },
            lastValue: { $last: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/6e759a16264041ecb47194bca245aa3e.png

6.3 Map-Reduce操作

MongoDB使用Map-Reduce来处理复杂的数据分析任务。

6.3.1 MongoDB中Map-Reduce操作介绍

Map-Reduce在MongoDB中是一种用于处理和聚合数据的强大工具,尤其适用于需要对大量数据进行复杂分析的场景。下面是对MongoDB中Map-Reduce操作语法的介绍。

基本概念

  1. Map函数 :负责处理输入文档,并为每个输入文档调用一次 emit(key, value) 函数生成键值对。
  2. Reduce函数 :接收Map阶段输出的一个键和该键对应的值列表,并将这些值归约为一个单一的输出值。
  3. 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 }
]);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/43fdb41d73804738b7ac801173085fde.png

示例

定义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"
    }
);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/e159822fcf9f4ab7b3672fe8843a36c9.png

查看结果 :执行完上述操作后,可以通过查询新集合 order_totals 来查看每个客户的订单总额。

db.order_totals.find();

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/86c840c3526040349267cadb4649abb9.png


五、索引操作

1. MongoDB索引介绍

MongoDB中的索引是为了提高查询性能而设计的数据结构。通过为集合中的一个或多个字段创建索引,可以显著加快查询速度。然而,值得注意的是,虽然索引加速了读取操作,但它们也增加了写入操作(如插入和更新)的成本,并占用额外的存储空间。

2. MongoDB索引类型

MongoDB支持多种类型的索引,以满足不同的需求:

  • 单字段索引 :在单个字段上创建的索引。
  • 复合索引 :包含多个字段的索引。
  • 多键索引 :用于数组字段上的索引。
  • 文本索引 :支持对字符串内容进行全文搜索。
  • 地理空间索引 :包括 2dsphere2d 索引,支持基于地理位置的数据查询。
  • 哈希索引 :主要用于支持分片键的哈希分片。

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/f267d5509ce041899893a39dfae280ab.png

示例1 :为 name 字段创建一个升序索引。

db.students.createIndex({ name: 1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/40744eac244f40569578ca6bc41ca3e4.png

  • “numIndexesBefore”: 1 :这表示在创建新索引之前,集合中已经存在的索引数量。由于MongoDB默认会在 _id 字段上自动创建一个索引,所以这里显示的是1。
  • “numIndexesAfter”: 2 :这表明在成功创建新索引之后,集合中现在总共有的索引数量。因为刚刚为 name 字段创建了一个新的升序索引,所以索引总数从1增加到了2。
  • “createdCollectionAutomatically”: false :这个字段指示是否因为创建索引而自动创建了集合。在这个例子中,值为 false ,意味着集合 students 在执行此操作之前已经存在,并非因创建索引而自动创建的。
  • “ok”: 1 :这是一个状态标识符,表明操作成功完成。如果出现错误,这个字段的值会是 0 ,并且通常会有额外的错误信息来描述问题所在。

示例2 :在 agescores 字段上创建一个复合索引。

db.students.createIndex({ age: 1, scores: -1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7a3fb9cf6f424b0eb63292ab6eafe78d.png

4. 查看索引

查看索引语法如下:

db.<collection_name>.getIndexes();

示例 :查看 students 集合中已经存在的索引。

db.students.getIndexes();

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/5a471d3100cc41e09da66004965501e5.png

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/8c561bba9d0e4cc7a3c777091f9bcf1f.png

  • “nIndexesWas”: 3 :这表示在执行删除操作之前,集合中总共有3个索引。
  • “ok”: 1 :这是一个状态标识符,表明操作成功完成。

示例2 :删除为 agescores 字段创建的复合索引。

db.students.dropIndex({ age: 1, scores: -1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ac77f4e471d043f8816c86244b460aeb.png

5.2 删除多个索引

删除多个索引语法如下:

db.<collection_name>.dropIndexes(
    <indexes>,
    {
        writeConcern: <document>
    }
);

示例1 :删除除 _id 索引之外的所有索引。

db.students.dropIndexes();

db.students.dropIndexes("*");

示例2

分别为 nameage 字段创建升序索引。

db.students.createIndex({ name: 1 });
db.students.createIndex({ age: 1 });

根据索引名称删除 nameage 字段的升序索引。

db.students.dropIndexes(["age_1", "name_1"]);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ac7273458dfc4703876015a96a89a35b.png


六、用户和权限管理

1. 内置角色及相关权限

MongoDB内置了多种角色,用于提供不同层次和类型的权限管理。

以下概述了一些常用的内置角色及其描述:

角色名称描述
read允许用户读取指定数据库中的所有非系统集合的数据。
readWrite包括 read 角色的所有权限,并允许在所有非系统集合上进行插入、更新和删除操作。
dbAdmin提供执行管理任务的能力,如模式管理(索引创建和删除)、统计信息收集等,但不包括用户和角色管理。
userAdmin允许管理当前数据库的用户和角色,包括创建用户、修改密码以及分配角色。拥有此角色的用户可以赋予自己任何权限。
clusterAdmin提供最高的集群管理操作权限,包括添加和移除节点、查看集群状态等。它包含其他集群管理角色,如 clusterManagerclusterMonitorhostManager
readAnyDatabase类似于 read 角色,但是作用范围扩展到了所有的数据库(除了 localconfig )。需要在 admin 数据库中授予。
readWriteAnyDatabase类似于 readWrite 角色,但是作用范围扩展到了所有的数据库(除了 localconfig )。需要在 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" } ]
    }
);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ec23bd7c7cb143babe30927b041ce46a.png

示例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" }
        ]
    }
);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ff55db6afaeb4e95b57ca11c86570d8d.png

示例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" } ]
    }
);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/d70660b1ef284a44bfcbc78bf27c1b14.png

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/debe0e3c9a304c30b2011ba6a0df634d.png

示例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;

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/fe48e2d7eaa74729b1f0015b19429fc3.png

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 数据库中用户 customuserreadWrite 角色。

use testdb;
db.revokeRolesFromUser(
    "customuser",
    [ { role: "readWrite", db: "testdb" } ]
);

5. 删除用户

删除用户语法如下:

db.dropUser(
    <username>,
    {
        writeConcern: <document>
    }
)

示例 :删除数据库 testdb 中的 customuser 用户。

use testdb;
db.dropUser("customuser")

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/addafaee75f74e9593d59ebc9b7b66ed.png


七、帮助信息命令

1. 查看命令帮助信息

help 命令可以查看一些基本的命令列表。这包括集合操作、数据库操作等。

help

2. 查看数据库帮助信息

db.help() 命令会显示与数据库相关的命令列表。

db.help()

3. 查看集合帮助信息

db.collection.help() 命令会显示与集合相关的命令列表。

db.collection.help()